2012-11-14 10 views
15

Sto usando i binari 3.0.14 e sto costruendo route.rb usando lo stile pieno di risorse. Mi piacerebbe avere un percorso con caratteri jolly che raccolga tutte le richieste che non corrispondono a nessun percorso indicato.Rails catch-all route

Qual è il modo appropriato per costruire un percorso del genere?

risposta

24

messo

match '*path' => 'your_controller#your_action' 

alla fine del file routes.rb. Questo è importante, dal momento che le rotte sono attraversate dall'alto verso il basso.

Vedi anche http://guides.rubyonrails.org/routing.html -> 3.10

16

per guida 4, è necessario specificare il tipo di richiesta:

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

Come altri hanno detto, mettere questo nella parte inferiore del file percorsi.

+3

Rails 4 catch-all che reindirizza a root 'match" * percorso ", a : redirect ('/'), tramite:: all' – Epigene

2

Oltre a @steel e @awenkhh, vi consiglio di aggiungere il seguente all'azione controllore di quella rotta

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

In caso contrario, si finirà con alcuni ActionView::MissingTemplate: Missing template errori per i formati che non ci aspettavamo.

[rant] Particolarmente utile per coloro che cercano vettori di attacco errati intorno a /wp-admin/css/wp-admin.css e simili. Mi sembra di ottenere circa 100 richieste per /wp-admin/* un giorno, da persone super fastidiose che a quanto pare vorrebbero avere un piano di account Rollbar più costoso. [/ Rant]

3

Non è obbligatorio utilizzare esattamente "percorso" nel Dichiarazione match '*path'. È possibile impostare un qualsiasi gettone c'è:

get "*string1" 

o

get "*string2" 

Rails assegnerà il tuo vero HTTP-query per il parametro chiamato dopo il token, ad esempio:

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

in consolle :

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

È possibile utilizzare più di un asterisco, ad esempio get "*id*user". Ma in questo caso otterrai un risultato imprevedibile, perché Rails elabora 2 o più asterischi "in modo intuitivo" - per maggiori informazioni vedi http://guides.rubyonrails.org/routing.html#route-globbing-and-wildcard-segments