2012-10-05 15 views

回答

2

標準的方式來做到這一點是將代碼放在lib/,並確保它是由軌道自動加載通過添加一行config/application.rb:在你的代碼

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

然後,只要確保你需要它,無論你用它。如果你想處處應用它,創造config/initializers的初始化用一條線:

require 'my_array' 

my_array.rblib,你有文件的文件名。這將使你的模型,控制器,提供意見等

參見:Best way to load module/class from lib folder in Rails 3?

此外,提防自動加載的紅寶石(不僅僅是Rails)的目錄結構的一個陷阱,在這個答案解釋:Best way to load module/class from lib folder in Rails 3?

3

您可以將其放入lib/並確保它是自動加載的,如shioyama回答中所述;或者你可以把它放入初始化程序。我更喜歡初始化方法,因爲它更容易(您可以自由加載)。

我通常會在initializers目錄下創建一個core_ext子目錄,並將我的核心類擴展放在那裏。我總是試圖把正在擴展的類的什麼我添加到文件名的描述的名稱,所以在你的情況我會創建一個包含文件RAILS_ROOT/config/initializers/core_ext/array_my_function

module MyFunctionForArray 
    def my_function(arg1, arg2) 
    # ... 
    end 
end 

Array.send :include, MyFunctionForArray 

我總是儘量不用重啓該類並直接擴展它,但將我的擴展插入到模塊中,然後將此模塊包含到類中以進行擴展。

+0

我也在做初始化工作,但我曾經重新開課。包含模塊而不是重新開放課程的方法是否有優勢? – rubyprince

+1

在我看來,當你包含一個包含你所有擴展的模塊(你在原始類的祖先鏈中添加一個新的元素,而直接向類中添加X新的方法),你不會污染原始類。當你需要確定方法的定義位置時,它可以幫助你:'[1,2,3] .method(:my_function)'例如告訴你方法* my_function *來自模塊而不是類本身,因此使你更容易找到它... – severin

+0

行..有道理..謝謝。 – rubyprince

相關問題