Ruby on Rails: получить имя контроллера и действия на основе пути - PullRequest
19 голосов
/ 11 августа 2010

Я пытаюсь получить имя контроллера и действия на основе пути.У меня есть маршрут:

map.resources :permissions

Я подумал, что мог бы использовать:

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

Чтобы получить хеш-код:

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

Фактический хешобратно это:

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

Как получить правильное имя действия вместо только что переданного в ID?Диспетчер должен каким-то образом добраться до этого, иначе Rails не сработает, но у меня возникают проблемы с поиском того, как это делается.

Ответы [ 3 ]

16 голосов
/ 10 марта 2016

Начиная с Rails 4, метод распознавания пути теперь Rails.application.routes.recognize_path, а не ActionController::Routing::Routes.recognize_path, и он возвращает хэш контроллера, действия и идентификатора следующим образом:

Rails.application.routes.recognize_path(app.edit_somecontroller_path(1))
 => {:controller=>"somecontroller", :action=>"edit", :id=>"1"}
12 голосов
/ 11 августа 2010

Что вы действительно после?Если вы действительно после имени действия и имени контроллера ... вы можете просто спросить

controller.controller_name

и

controller.action_name

Помогает ли это, или вам действительно нужно проанализироватьстрока для этого?

4 голосов
/ 08 октября 2010

Я так и сделал. Это некрасиво и должно быть лучшее решение, но пока оно работает. Это происходит в before_filter, так что я могу видеть, есть ли у пользователя доступ к контроллеру / действию, к которому они пытаются получить доступ.

Я решил использовать авторизацию на основе маршрутов, а не авторизацию на основе моделей.

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

Затем вы получаете доступ к контроллеру и действию с помощью request.params [: controller] и request.params [: action].

Все это не будет необходимо, если ActionController :: Routing :: Routes.recognize_path ("/ permissions / 1") вернул правильное действие.

...