Ruby on Rails:根据路径获取控制器和操作名称

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)

这有帮助吗,或者你真的需要解析一个字符串吗?

  • 我有基于路由的授权.基本上,在我的数据库中,我插入了我只希望某些用户可以访问的控制器和操作,并将它们视为权限.我将这些权限捆绑到角色中并将其分配给我的用户.当访问受保护的页面时,before过滤器将确定是否允许用户在该页面上.这很有效(通过使用您建议的方法).现在我需要根据是否允许用户访问链接后面的页面来动态显示链接.我无权访问目标控制器,只能访问路径. (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)
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用 request.params[:controller] 和 request.params[:action] 访问控制器和操作。

如果 ActionController::Routing::Routes.recognize_path("/permissions/1") 返回正确的操作,则所有这些都不是必需的。