2012-12-15 50 views
2

我有很多小的實用方法(如重新格式化或解析簡單的對象,如字符串)我一直在ApplicationHelper。在rails中,哪裏是正確的地方放置方法,需要可用「任何地方」

但是,ApplicationHelper方法顯然無法通過模型中的類方法訪問。

有一個解決辦法,這是灑thoughout我的項目:

include ApplicationHelper # needed to use apphelper method in instance method 
extend ApplicationHelper # needed to use apphelper method in class method 

,它似乎工作。但它看起來像一團糟。

有沒有更好的地方放置實用方法,以便他們可以從我的項目中的任何地方訪問 - 視圖,控制器方法,模型實例方法,模型類方法?

+1

你monkeypatching核心類像字符串?還是這些特定於域的更改? (如格式化地址)只是試圖瞭解這些是真正的「無處不在」方法還是真的只是與模型相關,但是想要隨處訪問。有沒有可能看到一些示例方法?這可能有助於指導對話。 – jstim

+0

我們使用電話號碼進行了很多工作,例如,根據一些自定義要求,我們有很多方法來對它們進行消毒 – jpwynn

回答

4

這是lib/的用途。我在lib/deefour.rb

require "deefour/core_ext" 

module Deefour; end 

我把自定義的方法lib/deefour/helpers.rb

module Deefour 
    module Helpers 
    extend self 

    def some_method 
     # ... 
    end 
    end 
end 

和核心猴子補丁lib/deefour/core_ext.rb

class String 
    def my_custom_string_method(str) 
    # ... 
    end 
end 

文件在config/initializers/deefour.rb我把

require "deefour" 

在你config/application.rb請確保您有

config.autoload_paths += Dir["#{config.root}/lib"] 

最後,在ApplicationController(對於控制器)ApplicationHelper(用於視圖)和任何其他地方,我需要它(即。一個特定的模型在這裏和那裏)我只是做

include ::Deefour::Helpers 
+0

有一件事 - 在您的config/initializers/deefour.rb示例中,我認爲它需要'include '不'要求' – jpwynn

+0

不,絕對不是。我建議閱讀Ruby中'require'和'include'之間的區別。在這種情況下,我*不*試圖將特定模塊(它是類/方法)的內容包含到應用程序範圍中---我試圖加載**文件**,使得模塊本身可用於應用程序中的其他文件。 – deefour

相關問題