Ruby on Rails: получите контроллер и имя действия на основе пути
-
27-09-2019 - |
Вопрос
Я пытаюсь получить контроллер и имя действия на основе пути. У меня есть маршрут:
map.resources :permissions
Я думал, что могу использовать:
ActionController::Routing::Routes.recognize_path "/permissions/1"
Чтобы получить хеш, как:
{ :controller => "permissions", :action => "show" }
Фактический хеш, который возвращается, это:
{ :controller => "permissions", :action => "1" }
Как получить правильное имя действия вместо того, чтобы только мои прошли в ID? Диспетчер должен быть в состоянии получить ему как-то или рельсы не будут работать, но у меня возникли проблемы, расположенные, как это достигнуто.
Решение 3
Это то, что я оказался. Это безобразно, и там должен быть лучший способ, но он работает сейчас. Это происходит в до_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 [: контроллер] и request.params [: действие].
Все это не было бы необходимости, если ActionController :: Маршрутизация :: Маршруты.recognize_Path («/ permissions / 1») вернул правильное действие.
Другие советы
С помощью рельсов 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"}
Что вы на самом деле после? Если вы на самом деле после имени действия и имени контроллера ... вы можете просто попросить
controller.controller_name
и
controller.action_name
Это помогает или вам действительно нужно разбирать строку, чтобы сделать это?