Ruby on Rails: получить имя контроллера и действия по пути
Я пытаюсь получить имя контроллера и действия на основе пути. У меня есть маршрут:
map.resources :permissions
Я думал, что могу использовать:
ActionController::Routing::Routes.recognize_path "/permissions/1"
Чтобы получить хэш, например:
{ :controller => "permissions", :action => "show" }
Реальный хеш, который возвращается:
{ :controller => "permissions", :action => "1" }
Как мне получить правильное имя действия вместо моего переданного в ID? Диспетчер должен иметь возможность как-то добраться до него, или Rails не будет работать, но у меня возникают проблемы с поиском того, как это выполняется.
Ответы
Ответ 1
Это то, что я закончил делать. Это уродливо, и должен быть лучший способ, но он работает пока. Это происходит в файле 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" ) вернул правильное действие.
Ответ 2
Что вы на самом деле после? Если вы действительно после имени действия и имени контроллера... вы можете просто попросить
controller.controller_name
и
controller.action_name
Помогает ли это, или вам действительно нужно разбирать строку, чтобы сделать это?
Ответ 3
В Rails 4 метод распознавания пути теперь Rails.application.routes.recognize_path
в отличие от ActionController::Routing::Routes.recognize_path
и возвращает хеш контроллера, действия и id следующим образом:
Rails.application.routes.recognize_path(app.edit_somecontroller_path(1))
=> {:controller=>"somecontroller", :action=>"edit", :id=>"1"}