我正在尝试根据路径获取控制器和操作名称。我有一条路线:
map.resources :permissions
我以为我可以使用:
ActionController::Routing::Routes.recognize_path "/permissions/1"
获得如下的哈希:
{ :controller => "permissions", :action => "show" }
回来的实际哈希是:
{ :controller => "permissions", :action => "1" }
如何获取正确的操作名称而不仅仅是我传入的ID?调度员必须能够以某种方式获得它,否则Rails将无法工作,但我无法找到它是如何完成的。
答案 0 :(得分:15)
从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"}
答案 1 :(得分:12)
你真正追求的是什么?如果你真的在动作名称和控制器名称之后......你可以要求
controller.controller_name
和
controller.action_name
这有帮助,还是你真的需要解析一个字符串才能做到这一点?
答案 2 :(得分:4)
这就是我最终要做的事情。这很丑陋,必须有更好的方法,但它现在有效。它发生在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”)返回了正确的操作,则所有这些都不是必需的。