23

我正在尝试根据路径获取控制器和操作名称。我有一条路线:

map.resources :permissions

我认为我可以使用:

ActionController::Routing::Routes.recognize_path "/permissions/1"

得到一个像这样的哈希:

{ :controller => "permissions", :action => "show" }

返回的实际哈希是:

{ :controller => "permissions", :action => "1" }

如何获取正确的操作名称,而不仅仅是我传入的 ID?调度程序必须能够以某种方式处理它,否则 Rails 将无法工作,但我无法找到它是如何完成的。

4

3 回答 3

26

从 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"}
于 2016-03-09T21:49:50.740 回答
12

你真正追求的是什么?如果你真的在行动名称和控制器名称之后......你可以要求

controller.controller_name

controller.action_name

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

于 2010-08-11T10:07:04.193 回答
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") 返回正确的操作,则所有这些都不是必需的。

于 2010-10-08T15:41:32.380 回答