2009-06-29 49 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

相關問題