2010-08-11 2 views
15

Ich versuche, den Controller und Aktion Name basierend auf einem Pfad zu bekommen. Ich habe eine Route:Ruby on Rails: Holen Sie sich den Controller und Aktion Name basierend auf einem Pfad

map.resources :permissions 

Ich dachte, dass ich verwenden könnte:

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

Um einen Hash wie zu erhalten:

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

Die tatsächliche Hash, der zurück ist kommt:

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

Wie bekomme ich den richtigen Aktionsnamen anstatt nur meine ID? Der Dispatcher muss irgendwie dazu in der Lage sein, oder Rails würde nicht funktionieren, aber ich habe Probleme herauszufinden, wie es durchgeführt wird.

Antwort

2

Dies ist, was ich getan habe. Es ist hässlich und es muss einen besseren Weg geben, aber es funktioniert für jetzt. Es passiert in einem before_filter, so dass ich sehen kann, ob der Benutzer Zugriff auf den Controller/die Aktion hat, auf die er zuzugreifen versucht.

Ich entschied mich für die Verwendung der routenbasierten Autorisierung im Gegensatz zur modellbasierten Autorisierung.

# 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) 

Dann greifen Sie auf den Controller und die Aktion mit request.params [: Controller] und request.params [: Maßnahme].

All dies wäre nicht erforderlich, wenn ActionController :: Routing :: Routes.recognose_path ("/ Berechtigungen/1") die richtige Aktion zurückgegeben.

11

Wonach suchen Sie wirklich? Wenn Sie wirklich nach dem Aktionsnamen und Controller-Namen sind ... können Sie einfach fragen Sie nach

controller.controller_name 

und

controller.action_name 

dass Hilfe Does, oder brauchen Sie wirklich eine Zeichenfolge zu analysieren zu tun es?

+2

Ich habe routenbasierte Autorisierung anstelle . Im Grunde stecke ich in meiner Datenbank Controller und Aktionen an, die nur bestimmten Benutzern zugänglich sein sollen, und behandle sie als Berechtigungen. Ich bündle diese Berechtigungen in Rollen und weise sie meinen Benutzern zu. Wenn eine geschützte Seite besucht wird, ermittelt ein Vorher-Filter, ob der Benutzer auf dieser Seite sein darf. Das funktioniert großartig (mit den von Ihnen vorgeschlagenen Methoden). Jetzt muss ich einen Link dynamisch anzeigen, abhängig davon, ob der Benutzer die Seite hinter dem Link besuchen darf oder nicht. Ich habe keinen Zugriff auf den Zielcontroller, nur den Pfad. –

10

Ab Schienen 4 das Verfahren den Pfad zu erkennen ist nun Rails.application.routes.recognize_path zu ActionController::Routing::Routes.recognize_path gegenüber und es gibt einen Hash-Controller, Aktion und ID wie folgt:

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

Beachten Sie, dass diese Syntax funktioniert, wenn sie von der Rails-Konsole aufgerufen wird, aber wenn ich sie vom application_controller aus aufgerufen habe, musste ich die "app" entfernen. von "app.edit_somecontroller ..." Teil. So zum Beispiel: Rails.application.routes.recognise_path (users_path) – JosephK