2010-08-11 11 views
15

Próbuję uzyskać nazwę kontrolera i akcji na podstawie ścieżki. Mam trasę:Ruby on Rails: pobierz nazwę kontrolera i akcji na podstawie ścieżki

map.resources :permissions 

Myślałem, że mogę używać:

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

Aby uzyskać hash jak:

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

Rzeczywista hash, że wraca się:

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

Jak uzyskać poprawną nazwę akcji zamiast tylko mojego przekazanego ID? Dyspozytor musi być w stanie jakoś się do niego dostać, albo Rails nie będzie działał, ale mam problem ze zlokalizowaniem sposobu jego wykonania.

Odpowiedz

2

Tak właśnie zrobiłem. Jest brzydki i musi być lepszy sposób, ale na razie działa. Zdarza się to w pliku before_filter, dzięki czemu widzę, czy użytkownik ma dostęp do kontrolera/działania, do którego próbuje uzyskać dostęp.

Wybrałem opcję autoryzacji opartej na trasach w przeciwieństwie do autoryzacji modelowej.

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

Następnie należy uzyskać dostęp do kontrolera i działania z request.params: Kontroler [] i [request.params: akcja].

Wszystko to nie byłoby konieczne, jeśli ActionController :: Routing :: Routes.recognize_path ("/ permissions/1") zwrócił poprawną akcję.

11

Po co tak naprawdę? Jeśli jesteś naprawdę po nazwie działania i nazwa kontrolera ... można po prostu poprosić o

controller.controller_name 

i

controller.action_name 

Czy to pomoc, czy też naprawdę trzeba analizować ciąg zrobić to?

+2

mam upoważnienie tras opartych na miejscu . Zasadniczo w mojej bazie danych podłączam kontrolery i akcje, które chcę tylko dla niektórych użytkowników i traktuję je jako uprawnienia. Łączę te uprawnienia w role i przypisuję je moim użytkownikom. Gdy odwiedzana jest strona chroniona, filtr "przed" określi, czy użytkownik może być na tej stronie. To działa świetnie (używając metod, które zasugerowałeś). Teraz muszę dynamicznie wyświetlać link w zależności od tego, czy użytkownik może odwiedzać stronę za linkiem. Nie mam dostępu do kontrolera docelowego, tylko ścieżkę. –

10

Jak Rails 4 metody rozpoznawania ścieżkę jest teraz Rails.application.routes.recognize_path w przeciwieństwie do ActionController::Routing::Routes.recognize_path i zwraca hash kontrolera, akcji i id tak:

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

Pamiętaj, że ta składnia działa, jeśli została wywołana z konsoli Rails, ale kiedy wywołałem ją z kontrolera application_controller, musiałem usunąć "aplikację". z części "app.edit_somecontroller ...". Na przykład: Rails.application.routes.recognize_path (ścieżka_użytkowników) – JosephK