2009-06-29 47 views
6

在Rails控制器或视图的范围内: 如何查询Rails路由机制以将相对url字符串(例如“/ controllername/action/whatever”)转换为控制器类将负责处理该请求如何确定控制器类给定的URL字符串

我想做的事情是这样的:?

controllerClass = someMethod("/controllername/action/whatever") 

哪里contorllerClass是类的实例

我不想做任何假设关于路由约定例如。上例中的“controllername”始终是控制器的名称(因为它不是)。

回答

11

您的解决方案在卡洛斯那里建设:

path = "/controllername/action/whatever" 
c_name = ActionController::Routing::Routes.recognize_path(path)[:controller] 
controllerClass = "#{c_name}_controller".camelize.constantize.new 

会给你一个控制器类的新实例。

+0

该死!在SO告诉我'已发布答案'的时候,它已经过了19分钟..从我+1正确的答案.. – Swanand 2009-06-29 08:28:52

0

我不知道是否有更好的方法来做到这一点,但我会尝试看看Rails自己的代码。

路由类有一些在测试中使用的断言方法。 他们得到一个路径和期望的控制器并断言它正确路由。

看那里应该给你一个良好的开端。

http://api.rubyonrails.org/classes/ActionController/Assertions/RoutingAssertions.html#M000598

专此行

generated_path, extra_keys = ActionController::Routing::Routes.generate_extras(options, defaults) 

希望有所帮助。

编辑:

看起来好像我指出了相反的例子。

你想PATH => CONTROLER /动作

那你应该看看

http://api.rubyonrails.org/classes/ActionController/Assertions/RoutingAssertions.html#M000597

这种或那种方式,我认为你可以找到沿着这些线路:)

1

ActionController::Routing::Routes.recognize_path "/your/path/here"

将打印:

{:controller=>"corresponding_controller", :action=>"corresponding_action" } # Plus any params if they are passed

相关问题