2009-06-29 11 views
6

Dentro del alcance de un controlador Rails o una vista: ¿Cómo puedo consultar el mecanismo de enrutamiento de Rails para convertir una cadena url relativa (por ejemplo, "/ nombre controlador/acción/lo que sea" en el controlador clase que sería responsable del manejo de dicha solicitudCómo determinar la clase del controlador cadena URL dada

que quiero hacer algo como esto:?.

controllerClass = someMethod("/controllername/action/whatever") 

Dónde contorllerClass es una instancia de la clase

no quiero hacer ninguna suposición sobre un enrutamiento convención por ej. que el "nombre del controlador" en el ejemplo anterior es siempre el nombre del controlador (porque no lo es).

Respuesta

11

Construyendo fuera de Carlos allí:

path = "/controllername/action/whatever" 
c_name = ActionController::Routing::Routes.recognize_path(path)[:controller] 
controllerClass = "#{c_name}_controller".camelize.constantize.new 

le dará una nueva instancia de la clase de controlador.

+0

Darn! Para cuando SO me dijo "se ha publicado una respuesta", pasaron 19 minutos. +1 de mí por la respuesta correcta. – Swanand

+2

No se aplica a Rails 3.2.x :( – Nowaker

+2

ahora ubicado en 'Rails. application.routes.recognize_path() ', por cierto. –

0

No sé si hay una mejor manera de hacerlo, pero trataría de ver el código de Rails.

Las clases de enrutamiento tienen algunos métodos de aserción utilizados en la prueba. Obtienen una ruta y el controlador esperado y afirman que se enruta correctamente.

Mirar allí debería darle un buen comienzo.

http://api.rubyonrails.org/classes/ActionController/Assertions/RoutingAssertions.html#M000598

Especialmente esta línea

generated_path, extra_keys = ActionController::Routing::Routes.generate_extras(options, defaults) 

Espero que ayude.

Editar:

Parece que os señalé el ejemplo contrario.

¿Quieres path => controler/acción

A continuación, usted debe buscar en

http://api.rubyonrails.org/classes/ActionController/Assertions/RoutingAssertions.html#M000597

una forma u otra creo que se puede encontrar su solución en ese sentido :)

1

ActionController::Routing::Routes.recognize_path "/your/path/here"

imprimiría:

{:controller=>"corresponding_controller", :action=>"corresponding_action" } # Plus any params if they are passed

Cuestiones relacionadas