2011-10-07 14 views
5

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 

risposta

6

È possibile utilizzare una classe per specificare i vincoli se si vuole qualcosa di più pulito una volta che si dispone di più percorsi da provare:

class MyConstraint 
    BYPASSED_ROUTES = ['users', 'my-stuff'] 

    def matches?(request) 
    BYPASSED_ROUTES.map {|r| request.path.include?(r)} .empty? 
    end 
end 

TwitterClone::Application.routes.draw do 
    match "*path" => "router#routing", :constraints => MyConstraint.new 
end 

Questo esempio è tratto dal rails routing guide.

+0

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. –

+0

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? –

+0

Ok, ho aggiunto i percorsi correnti alla mia domanda sopra. –

0

Sta prendendo un lambda; puoi usare qualunque criterio tu voglia.

Problemi correlati