- 論壇徽章:
- 0
|
這是一個(gè)我經(jīng)?吹降谋粏柤暗膯栴},為了一勞永逸,我決定解決它。將自定義的方法加載到rails應(yīng)用中,一般有幾種不同的方法。
首先,我們需要了解ruby一開始是如何加載的。在此,我簡要描述一下ruby和rails提供的幾種不同的加載方式。
load:加載并執(zhí)行指定文件名的ruby程序
require:ruby會(huì)試圖加載庫文件,如果成功則返回true
require_dependency:開發(fā)模式下,每次請(qǐng)求會(huì)重新加載源文件。因此,修改代碼會(huì)影響下一次請(qǐng)求
require_or_load:這種方式不安全,而且可能會(huì)導(dǎo)致被加載兩次
因此,理想的方案是使用require_dependency,因?yàn),在開發(fā)模式下,每次請(qǐng)求會(huì)重新加載源文件。要不然,你只有不斷的重啟服務(wù),那太瘋狂了!另外,在產(chǎn)品模式下,它只會(huì)加載一次。
那么,我們的代碼放哪兒才合適呢?rails加載路徑包括以下幾個(gè)目錄:app, lib, vendor and mock等,你必須在加載路徑中加入一個(gè)不同的路徑。
在config/environment.rb文件中的config.load_paths加入需要加載的路徑。
舉個(gè)例子:
Ruby代碼- config.load_paths += %W( custom )
復(fù)制代碼 這將會(huì)加載RAILS_ROOT/custom目錄,因此你可以使用該目錄下的所有文件。
將文件放在這個(gè)目錄下的問題是:雖然這些文件被加載了,但是你還是得在需要用的類里一個(gè)一個(gè)的require那些文件。一種替代方案是在rails環(huán)境中整體require所有的文件。
舉個(gè)例子,在我們的應(yīng)用中,我們需要擴(kuò)展String類。你可以在lib目錄下新建一個(gè)名為core的文件夾,如果需要,你可以將其他的一些ruby文件放入這個(gè)文件夾。
現(xiàn)在,我們?cè)趌ib/core目錄下新建一個(gè)ruby文件:string.rb
Ruby代碼- class String
- def replace_name
- self.gsub(/%name%/, "高海峰")
- end
- end
復(fù)制代碼 然后在lib目錄下再新建一個(gè)ruby文件:core_extensions.rb
Ruby代碼- module CoreExtensions
- def require_core_ext
- Dir["#{RAILS_ROOT}/lib/core/*.rb"].each do |f|
- require_dependency f
- end
- end
- end
- Object.instance_eval { include CoreExtensions }
復(fù)制代碼 然后在application.rb中加入如下代碼:
Ruby代碼這樣core_extensions.rb才會(huì)被使用到。
現(xiàn)在你可以在需要用的類中調(diào)用require_core_ext,這樣String類就多出了一個(gè)自定義的方法:replace_name,如果需要在整個(gè)應(yīng)用中使用這個(gè)方法,可以在application.rb中加入require_core_ext
如果你修改了string.rb文件,那么刷新一下頁面就可以看到效果。你可以像這樣去使用它:
Ruby代碼- puts "%name%,你好!".replace_name
復(fù)制代碼 這將會(huì)輸出如下結(jié)果:高海峰, 你好!
原文轉(zhuǎn)自:http://www.javaeye.com/topic/521123 |
|