2010-08-11 22 views
15

Estoy tratando de obtener el controlador y el nombre de la acción en función de una ruta. Tengo una ruta:Ruby on Rails: obtenga el nombre del controlador y la acción en función de una ruta

map.resources :permissions 

pensé que podría utilizar:

ActionController::Routing::Routes.recognize_path "/permissions/1" 

Para obtener un hash como:

{ :controller => "permissions", :action => "show" } 

El hash real que viene de vuelta es:

{ :controller => "permissions", :action => "1" } 

¿Cómo obtengo el nombre de la acción correcta? en lugar de solo mi ID pasada? El despachador debe poder acceder a él de alguna manera o Rails no funcionaría, pero tengo problemas para localizar cómo se realiza.

Respuesta

2

Esto es lo que terminé haciendo. Es feo y debe haber una mejor manera, pero funciona por ahora. Sucede en un before_filter para que pueda ver si el usuario tiene acceso al controlador/acción al que intentan acceder.

Elegí 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 se accede al controlador y la acción con request.params [manera: Control] y [request.params: Acción].

Todo esto no sería necesario si ActionController :: Routing :: Routes.recognize_path ("/ permisos/1") devolviera la acción correcta.

11

¿De qué estás realmente después? Si usted es realmente después de que el nombre de la acción y el nombre del controlador ... sólo puede pedir

controller.controller_name 

y

controller.action_name 

ayuda eso, o lo que realmente necesita para analizar una cadena que hacer ¿eso?

+2

tengo la autorización basada en ruta en lugar . Básicamente, en mi base de datos conecto los controladores y las acciones que solo quiero que sean accesibles para ciertos usuarios y los trato como permisos. Incluyo estos permisos en roles y los asigno a mis usuarios. Cuando se visita una página protegida, un filtro anterior determinará si el usuario puede estar en esa página. Eso está funcionando bien (usando los métodos que sugirió). Ahora necesito mostrar dinámicamente un enlace según si el usuario puede o no visitar la página detrás del enlace. No tengo acceso al controlador de destino, solo la ruta. –

10

A partir de los carriles 4 el método para reconocer el camino es ahora Rails.application.routes.recognize_path a diferencia de ActionController::Routing::Routes.recognize_path y devuelve un hash de controlador, acción, y el ID de este modo:

Rails.application.routes.recognize_path(app.edit_somecontroller_path(1)) 
=> {:controller=>"somecontroller", :action=>"edit", :id=>"1"} 
+0

Tenga en cuenta que la sintaxis funciona si se llama desde la consola de Rails, pero cuando lo llamé desde el controlador de la aplicación, tuve que eliminar la "aplicación". de la parte "app.edit_somecontroller ...". Entonces, por ejemplo: Rails.application.routes.recognize_path (users_path) – JosephK

Cuestiones relacionadas