Capisco come trasformare :controller
, :action,
:etc
in un URL. Sto cercando di fare il contrario, come si può trovare l'azione che il router di rotaie chiamerà dall'URL?Routing inverso di rails: trovare il nome dell'azione dall'URL
14
A
risposta
13
qualcun altro potrebbe avere una via più breve per fare questo, ma se si sta solo valutando un URL, poi si va al ActionController::Routing::RouteSet
classe
per un config.routes.rb
map.resources :sessions
il codice per trovare è :
ActionController::Routing::Routes.recognize_path('/sessions/new', {:method => :get})
#=> {:controller => 'sessions', :action => 'new'}
destra:
ActionController::Routing::Routes.recognize_path('/sessions/1/edit', {:method => :get})
#=> {:controller => 'sessions', :action => 'edit', :id => 1}
sbagliato - senza la method
essere esplicitamente aggiunti, per impostazione predefinita partita a /:controller/:action/:id
:
ActionController::Routing::Routes.recognize_path('/sessions/1/edit')
#=> {:controller => 'sessions', :action => '1', :id => 'edit'}
Se siete entro l'azione e vorreste sapere, è un po 'più facile chiamando params[:action]
qui puoi trovare tutto ciò che hai sempre desiderato sapere su: set: http://caboo.se/doc//classes/ActionController/Routing/RouteSet.html#M004878
Spero che questo aiuti!
22
Con Rails 3 si può fare:
Rails.application.routes.recognize_path('/areas/1')
=> {:controller=>"areas", :action=>"show", :id=>"1"}
Mi piace la tua idea. Perché: route_set.recognize_path (app.edit_foo_path (1)) ritorno: {: controller => "foos",: action => "1",: id => "edit"} Certanly, i binari sanno che l'azione è edit, e l'id è 1, non viceversa? – SooDesuNe
sembra corrispondere su '/ controller/action/id' invece della rotta RESTful. Test, sono stato in grado di farlo funzionare correttamente passando sempre il metodo, senza il metodo - va sempre al default. Ho anche modificato il post, preferisci utilizzare "ActionController :: Routing :: Routes". –