锁定老帖子 主题:在rails中如何加载自定义方法
精华帖 (2) :: 良好帖 (12) :: 新手帖 (0) :: 隐藏帖 (3)
|
|
---|---|
作者 | 正文 |
发表时间:2009-11-20
这是一个我经常看到的被问及的问题,为了一劳永逸,我决定解决它。将自定义的方法加载到rails应用中,一般有几种不同的方法。
load:加载并执行指定文件名的ruby程序
因此,理想的方案是使用require_dependency,因为,在开发模式下,每次请求会重新加载源文件。要不然,你只有不断的重启服务,那太疯狂了!另外,在产品模式下,它只会加载一次。
那么,我们的代码放哪儿才合适呢?rails加载路径包括以下几个目录:app, lib, vendor and mock等,你必须在加载路径中加入一个不同的路径。
举个例子:
config.load_paths += %W( custom )
这将会加载RAILS_ROOT/custom目录,因此你可以使用该目录下的所有文件。
将文件放在这个目录下的问题是:虽然这些文件被加载了,但是你还是得在需要用的类里一个一个的require那些文件。一种替代方案是在rails环境中整体require所有的文件。
class String def replace_name self.gsub(/%name%/, "高海峰") end end
然后在lib目录下再新建一个ruby文件:core_extensions.rb
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 }
然后在application.rb中加入如下代码:
include CoreExtensions
现在你可以在需要用的类中调用require_core_ext,这样String类就多出了一个自定义的方法:replace_name,如果需要在整个应用中使用这个方法,可以在application.rb中加入require_core_ext
puts "%name%,你好!".replace_name
这将会输出如下结果:高海峰, 你好! 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-11-21
这个总结很有用,不过最好把ruby和rails的load机制分开讲,ruby本身实际上只有require和load两种
|
|
返回顶楼 | |
发表时间:2010-06-09
最后修改:2010-06-09
很有用。投个良好。
require_dependency是rails的。 默默的问下http://devbbs.doit.com.cn/archiver/ 这个网址是谁做的,总是抓je的东西。 |
|
返回顶楼 | |
发表时间:2010-06-09
请不要无视 initializers 目录,我说完了。
这是我发的最后一帖, 以后在heroku上建个博客玩去了 |
|
返回顶楼 | |
发表时间:2010-06-10
下一站,火星 写道 请不要无视 initializers 目录,我说完了。
这是我发的最后一帖, 以后在heroku上建个博客玩去了 额,也不要无视rails初始化加载顺序: 有时候即使加载了,位置不对也没用.... # Rails configuration load order is: # # 1. config/preinitializer.rb # 2. config/environment.rb # 3. config/environments/#{RAILS_ENV}.rb # 4. plugin initialization # 5. gem initialization # 6. config/initializer/*.rb # 7. all after_initialize blocks, in the order they were defined in (so same order as above) # 8. any junk left below the Rails::Initializer.run call/block in environment.rb |
|
返回顶楼 | |
发表时间:2010-06-21
讲的很好, 向高手们学习
|
|
返回顶楼 | |
浏览 4832 次