Ruby on Rails: получите контроллер и имя действия на основе пути

StackOverflow https://stackoverflow.com/questions/3457067

  •  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

Это помогает или вам действительно нужно разбирать строку, чтобы сделать это?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top