2011-09-01 9 views
6

Używam szyn, aby chronić dostęp do plików, które muszą być dostarczane tylko niektórym użytkownikom aplikacji internetowej. Aby to zrobić, używam metody kontrolera, która akceptuje informacje o pliku, do którego chce uzyskać dostęp, sprawdza ich autoryzację, a następnie, jeśli są autoryzowane, używa x-sendfile, aby wysłać je do nich. Ta koncepcja działa dobrze, z wyjątkiem jednego szkopu: jeśli zażąda zasobu o wartości. w tym moim routingu nie wie, jak sobie z tym poradzić. W moim pliku tras mam:routing szyn i params z "." w nich

match 'atb_resources/:guid/:resource' => 'atb_resources#show', :as => :get_atb_resource, :via => :get 

a ale gdy próbuję to w moim specyfikacji:

get 'show', :guid => 'some_guid', :resource => 'blah.txt' 

spec nie powiedzie się:

Failure/Error: get 'show', :guid => @atb.guid, :resource => 'blah.txt' 
ActionController::RoutingError: 
    No route matches {:guid=>"ABCDEFG5", :resource=>"blah.txt", :controller=>"atb_resources", :action=>"show"} 

ale to jest w porządku:

get 'show', :guid => 'some_guid', :resource => 'blahDOTtxt' 

Zakładam, że problem dotyczy mój routing, ale tak naprawdę nie rozumiem, jak okresy wpływają na trasy. Jakieś pomysły?

Odpowiedz

8

Dla szyn 3 można dodać do trasy:

:constraints => { :resource => /.*/ } 

dla szyn 2 (AFAIK):

:requirements => { :resource => /.*/ } 

Szyny spróbuje zinterpretować .txt jako format specyfikatora bez jednego z te.

+0

Dokładnie to, czego potrzebowałem, dzięki! – Matthew