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"}