examples - Ruby on Rails: obtenga el controlador y el nombre de la acción basándose en una ruta
rake routes (3)
¿Qué es lo que realmente buscas? Si realmente está buscando el nombre de la acción y el nombre del controlador ... puede solicitarlo
controller.controller_name
y
controller.action_name
¿Eso ayuda, o realmente necesitas analizar una cadena para hacerlo?
Estoy tratando de obtener el controlador y el nombre de la acción en base a una ruta. Tengo una ruta:
map.resources :permissions
Pensé que podría usar:
ActionController::Routing::Routes.recognize_path "/permissions/1"
Para obtener un hash como:
{ :controller => "permissions", :action => "show" }
El hash real que regresa es:
{ :controller => "permissions", :action => "1" }
¿Cómo obtengo el nombre de acción correcto en lugar de solo mi ID aprobada? El despachador debe poder llegar a él de alguna manera o Rails no funcionaría, pero tengo problemas para localizar cómo se realiza.
A partir de Rails 4, el método para reconocer la ruta ahora es Rails.application.routes.recognize_path
en lugar de ActionController::Routing::Routes.recognize_path
y devuelve un hash de controlador, acción e identificación como tal:
Rails.application.routes.recognize_path(app.edit_somecontroller_path(1))
=> {:controller=>"somecontroller", :action=>"edit", :id=>"1"}
Esto es lo que terminé haciendo. Es feo y debe haber una mejor manera, pero funciona por ahora. Ocurre en un before_filter para que pueda ver si el usuario tiene acceso al controlador / acción al que intenta acceder.
Elegí usar la autorización basada en rutas en lugar de la autorización basada en modelos.
# Get method of current request
method = options[:method] ? options[:method] : ''get''
# Create a new request - hate this that is required
env = Rack::MockRequest.env_for(url, {:method => method})
request = ActionController::Request.new(env)
# For some reason, calling this fills in the controller / action information for the request
# just using recognize_path doesn''t work correctly with resources...
ActionController::Routing::Routes.recognize(request)
Luego accede al controlador y la acción con request.params [: controller] y request.params [: action].
Todo esto no sería necesario si ActionController :: Routing :: Routes.recognize_path ("/ permissions / 1") devolvió la acción correcta.