2009-12-17 43 views
1

我知道,如果我想調用另一個控制器的一個幫手,我可以不喜歡叫幫手:從另一種觀點認爲

helper :other_controllers 

但我不知道爲什麼我不能這樣做OtherControllersHelper。視圖內的方法?

回答

5

由於Rails加載你的模塊的方式,你不能沒有修改就做到這一點。

Rails將相關的幫助器模型包含到用於呈現模板的ActionView :: Base實例中。 ActionController :: Helpers#helper(在上面的示例中使用)將更多的輔助模塊添加到要包含的列表中。在視圖中使用的幫助程序方法被寫爲實例方法。 Ruby中的模塊沒有提供任何獲取實例方法而不使用構造函數的好方法。這是將模塊與類分離的重要事情之一。

要從另一個只有OtherControllersHelper.method的控制器訪問助手,您需要將方法重新定義爲類方法。但是,將這些方法重新定義爲類方法將使它們無法從您的視圖中訪問。

您可以將輔助程序中的所有實例方法複製爲類方法,但這絕對不是添加helper :other_controllers的更好解決方案。有些方法可以務實地定義包裝器,但是再次,它不是處理這種情況的最佳方法。

如果你有很多可能在多個控制器/視圖中使用的助手,也許你最好把它們放在別的地方。某處像app/helpers/application_helper.rb。或者另一個只能在需要它的控制器中加載的輔助模塊。

+0

我後來意識到助手是如何混入視圖(本質上和包含)的。 謝謝。 – gmoniey 2009-12-18 21:40:21