2016-02-12 20 views
0

我想在我的Rails 4.2應用程序中擴展字符串類。我創建了一個lib/string.rb文件來保存擴展名。自動需要在Rails 4中的lib文件

class String 
    def testing 
    "testing" 
    end 
end 

我將lib添加到application.rb中的autoload_paths。

config.autoload_paths << Rails.root.join('lib') 

當我啓動軌道控制檯和執行"".testing,我得到NoMethodError: undefined method 'testing' for "":String

任何人都可以解釋爲什麼這種方法沒有得到回升?我有一個預感,這是因爲String常量已經加載,所以Rails不需要自動加載常量。因此,它永遠不會嘗試加載lib/string.rb文件,我的方法永遠不會被添加到字符串中。

當我在初始化程序中明確要求文件時,我可以加載該方法,但是如果更改該方法,則必須重新啓動服務器才能使rails看到更改。這感覺就像我失去了一些東西。看起來應該有一種方法讓Rails自動讀取核心擴展類並在文件更改時重新加載它們。

+1

我把所有的猴子補丁放在lib/monkey中,並將以下內容添加到application.rb的底部:Dir.glob(Rails.root.join'lib','monkey' ,'**','* .rb')。each {| f |要求f} – mockaroodev

+0

謝謝。我最終用'Dir.glob(Rails.root.join'lib','autorequire','**','* .rb')創建了一個初始化程序。需要f}'。這將找到'lib/autorequire'目錄下的所有.rb文件以及所有子目錄,無論它們的嵌套程度如何。 – CodeSmith

回答

1

是的,你說得對。它不會自動加載字符串,因爲它已經被定義。我通常將核心類擴展放入初始化程序中。所以config/initializers/string.rb

+0

謝謝您的確認。我嘗試將初始化器保持在配置上,並避免將功能放入初始化器中。它絕對有效,但讓代碼在lib中生存,並從初始化程序或application.rb中獲取代碼似乎更簡潔。 – CodeSmith

相關問題