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

时间:2010-08-11 09:32:56

标签: ruby-on-rails rails-routing

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

map.resources :permissions

我以为我可以使用:

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

获得如下的哈希:

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

回来的实际哈希是:

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

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

3 个答案:

答案 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”)返回了正确的操作,则所有这些都不是必需的。