2009-06-29 4 views
6

Im Rahmen eines Rails-Controllers oder einer Ansicht: Wie kann ich den Rails-Routing-Mechanismus abfragen, um eine relative URL-Zeichenfolge (z. B. "/ controllername/action/whatever") in den Controller zu konvertieren Klasse, die für den Umgang mit diesem Antrag verantwortlich wäreSo ermitteln Sie die Steuerungsklasse angegebene URL-Zeichenfolge

ich so etwas wie dies tun will:.

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

Wo contorllerClass ist eine Instanz der Klasse

ich will keine Annahmen treffen, über ein Routing Konvention z. dass der "controllername" im obigen Beispiel immer der Name des Controllers ist (weil es nicht ist).

Antwort

11

Gebäude von Carlos dort:

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

gibt Ihnen eine neue Instanz der Controller-Klasse.

+0

Darn! Zu der Zeit, als SO mir sagte "eine Antwort wurde gepostet" war es 19 Minuten vorbei .. +1 von mir für die richtige Antwort .. – Swanand

+2

Gilt nicht für Rails 3.2.x :( – Nowaker

+2

jetzt bei 'Rails. application.routes.recognize_path() ', übrigens. –

0

Ich weiß nicht, ob es einen besseren Weg gibt, aber ich würde versuchen, den eigenen Code von Rails zu betrachten.

Die Routingklassen verfügen über einige Assertion-Methoden, die beim Testen verwendet werden. Sie erhalten einen Pfad und den erwarteten Controller und bestätigen, dass es korrekt routet.

Suchen dort sollten Sie einen guten Start darauf geben.

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

Speziell diese Linie

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

Hoffnung, das hilft.

Edit:

Es sieht aus wie ich Sie auf die entgegengesetzte Beispiel zeigte.

Sie wollen path => Controler/action

Dann sind Sie bei

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

Ein Weg aussehen sollte oder eine andere Ich glaube, Sie Ihre Lösung in diese Richtung finden können :)

1

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

Würde drucken:

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

Verwandte Themen