Sto cercando di scrivere un percorso catch-all in Rails 3, ma voglio riservare alcuni termini. Sono in particolare seguendo l'esempio mettere avanti in questo post, nella risposta da David Burrows: Dynamic routes with Rails 3Rails 3: semplificare la lettura di tutti i percorsi e modificare
La sintassi che sto usando è la seguente:
match '*path' => 'router#routing', :constraints => lambda{|req| (req.env["REQUEST_PATH"] =~ /(users|my-stuff)/).nil? }
Ora, che la sintassi funziona bene - se un utente visita una pagina con "user" o "my-stuff" nel percorso, cade attraverso il catch-all e va in un posto specifico. Se l'utente accede a qualsiasi altro URL, passa alla mia logica di routing.
La mia domanda è più sulla leggibilità - c'è un modo per abbinare il percorso a qualcosa di altro di un regex? C'è un modo per fornire una serie di termini da abbinare? Inoltre, c'è un modo per abbinare segmenti specifici del percorso, in contrasto con l'intera cosa?
Ovviamente Rails ha instradamento incorporato, ma questo progetto richiede che per alcuni percorsi il controller non sia presente nell'URL. Quindi, il catch-all.
Grazie per qualsiasi aiuto
Ecco il file percorsi aggiornati per la risposta qui sotto:
class RouteConstraint
RESERVED_ROUTES = ['users', 'my-stuff']
def matches?(request)
!RESERVED_ROUTES.map {|r| request.path.include?(r)}.empty?
end
end
App::Application.routes.draw do
resources :categories
resources :sites
match '*path' => 'router#routing', :constraints => RouteConstraint.new
devise_for :users, :path_names =>{ :sign_in => 'login', :sign_out => 'logout', :registration => 'register' }
root :to => "router#routing"
end
Questo si avvicina, ma ora anziché bypassare le "route nascoste" elencate, la logica prova a darle da mangiare al controller di routing. Se rimuovo il botto o il .empty? chiama il metodo delle partite, la logica funziona per le parole riservate, ma non per tutto il resto. Scusa, la mia comprensione di lambda è piuttosto limitata. –
Ah, ho frainteso la tua domanda allora, la mia logica era l'esatto opposto del tuo. Potresti postare un po 'di più dei tuoi percorsi, per vedere come si inserisce il catch-all? –
Ok, ho aggiunto i percorsi correnti alla mia domanda sopra. –