shallow rails examples concerns ruby-on-rails rails-routing

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.