19 ruby-on-rails rails-routing
我试图根据路径获取控制器和操作名称.我有一条路线:
map.resources :permissions
Run Code Online (Sandbox Code Playgroud)
我以为我可以用:
ActionController::Routing::Routes.recognize_path "/permissions/1"
Run Code Online (Sandbox Code Playgroud)
得到像这样的哈希:
{ :controller => "permissions", :action => "show" }
Run Code Online (Sandbox Code Playgroud)
回来的实际哈希是:
{ :controller => "permissions", :action => "1" }
Run Code Online (Sandbox Code Playgroud)
如何获取正确的操作名称而不仅仅是我传入的ID?调度员必须能够以某种方式获得它,否则Rails将无法工作,但我无法找到它是如何完成的.
Fre*_*ore 17
从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"}
Run Code Online (Sandbox Code Playgroud)
小智 12
你真的在追求什么?如果你真的在追随动作名称和控制器名称...你可以要求
controller.controller_name
Run Code Online (Sandbox Code Playgroud)
和
controller.action_name
Run Code Online (Sandbox Code Playgroud)
这有帮助吗,或者你真的需要解析一个字符串吗?
小智 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)
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用 request.params[:controller] 和 request.params[:action] 访问控制器和操作。
如果 ActionController::Routing::Routes.recognize_path("/permissions/1") 返回正确的操作,则所有这些都不是必需的。
| 归档时间: |
|
| 查看次数: |
12658 次 |
| 最近记录: |