2009-06-29 8 views
6

Dans le cadre d'un contrôleur Rails ou d'une vue: Comment puis-je interroger le mécanisme de routage Rails pour activer une chaîne d'URL relative (par exemple "/ nomContrôle/action/tout" dans le contrôleur classe qui serait responsable de la gestion de cette demandeComment déterminer la classe d'URL de la classe Contrôleur

Je veux faire quelque chose comme ceci:.

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

Où contorllerClass est une instance de classe

Je ne veux pas faire des hypothèses à propos d'un routage convention eg. que le "nom de contrôleur" dans l'exemple ci-dessus est toujours le nom du contrôleur (parce que ce n'est pas le cas).

Répondre

11

Construire de Carlos là:

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

vous donnera une nouvelle instance de la classe de contrôleur.

+0

Zut! Au moment où SO m'a dit 'une réponse a été postée' il était 19 minutes passé .. +1 de moi pour la bonne réponse .. – Swanand

+2

Ne s'applique pas pour Rails 3.2.x :( – Nowaker

+2

maintenant situé à 'Rails. application.routes.recognize_path() ', soit dit en passant. –

0

Je ne sais pas s'il existe une meilleure façon de le faire, mais j'essaierais d'examiner le code propre à Rails.

Les classes de routage ont certaines méthodes d'assertion utilisées lors des tests. Ils obtiennent un chemin et le contrôleur attendu et affirme qu'il route correctement.

Vous cherchez un bon point de départ?

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

Spécialement cette ligne

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

espoir qui aide.

Edit:

On dirait que je vous montrai l'exemple ci-contre.

Vous voulez path => controleur/Action

alors vous devriez regarder

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

une façon ou d'une autre je pense que vous pouvez trouver votre solution dans ce sens :)

1

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

imprimerait:

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

Questions connexes