2012-11-14 26 views
15

Używam szyn 3.0.14, a ja buduję routes.rb, używając zaradnego stylu. Chciałbym mieć trasę wieloznaczną, która przechwyci wszystkie żądania, które nie pasują do żadnej z podanych tras.Rails catch-all route

Jaki jest odpowiedni sposób na zbudowanie takiej trasy?

Odpowiedz

16

na szynę 4, trzeba określić typ zapytania:

match "*path", to: "application#custom_action", via: :all 

Jak mówili inni, umieścić to na samym dole pliku trasach.

+3

Rails 4 catch-all, który przekierowuje do root 'match" * path ", aby : przekierowanie ("/"), przez:: all' – Epigene

2

Oprócz @steel i @awenkhh, polecam dodanie następujących do działania kontrolera tej trasie za

respond_to do |format| 
    format.html 
    # other formats you already support 
    format.all { render text: '' } 
end 

przeciwnym razie będziesz skończyć z niektórych ActionView::MissingTemplate: Missing template błędów w formatach, które nie spodziewaliśmy.

[rant] Szczególnie pomocny dla osób próbujących błędnych wektorów ataku wokół /wp-admin/css/wp-admin.css i tym podobnych. Wydaje mi się, że otrzymuję dziennie około 100 żądań dla /wp-admin/* od super irytujących osób, które najwyraźniej chciałyby dostać droższy plan kont Rollbar. [/ Rant]

3

Nie jest obowiązkowe stosowanie dokładnie "ścieżki" w match '*path' oświadczenie. Można ustawić niezależnie żeton tam:

get "*string1" 

lub

get "*string2" 

Rails będzie przypisać swoje prawdziwe HTTP zapytanie do param po nazwie token, przykład:

get "*user" => "users#show" 

w konsoli :

Started GET "/john" .... 
Processing by UsersController#show as HTML 
Parameters: {"user"=>"john"} 

Możesz użyć więcej niż jednej gwiazdki, na przykład get "*id*user". Ale w tym przypadku uzyskasz nieprzewidywalny wynik, ponieważ Railsy przetwarzają 2 lub więcej gwiazdek "w intuicyjny sposób" - po więcej informacji zobacz http://guides.rubyonrails.org/routing.html#route-globbing-and-wildcard-segments

Powiązane problemy