论坛首页 编程语言技术论坛

在rails中如何加载自定义方法

浏览 4795 次
精华帖 (2) :: 良好帖 (12) :: 新手帖 (0) :: 隐藏帖 (3)
作者 正文
   发表时间:2009-11-20  

这是一个我经常看到的被问及的问题,为了一劳永逸,我决定解决它。将自定义的方法加载到rails应用中,一般有几种不同的方法。


首先,我们需要了解ruby一开始是如何加载的。在此,我简要描述一下ruby和rails提供的几种不同的加载方式。

 

load:加载并执行指定文件名的ruby程序
require:ruby会试图加载库文件,如果成功则返回true
require_dependency:开发模式下,每次请求会重新加载源文件。因此,修改代码会影响下一次请求
require_or_load:这种方式不安全,而且可能会导致被加载两次

 

因此,理想的方案是使用require_dependency,因为,在开发模式下,每次请求会重新加载源文件。要不然,你只有不断的重启服务,那太疯狂了!另外,在产品模式下,它只会加载一次。

 

那么,我们的代码放哪儿才合适呢?rails加载路径包括以下几个目录:app, lib, vendor and mock等,你必须在加载路径中加入一个不同的路径。


在config/environment.rb文件中的config.load_paths加入需要加载的路径。

 

举个例子:

 

config.load_paths += %W( custom )

 

这将会加载RAILS_ROOT/custom目录,因此你可以使用该目录下的所有文件。

 

将文件放在这个目录下的问题是:虽然这些文件被加载了,但是你还是得在需要用的类里一个一个的require那些文件。一种替代方案是在rails环境中整体require所有的文件。


举个例子,在我们的应用中,我们需要扩展String类。你可以在lib目录下新建一个名为core的文件夹,如果需要,你可以将其他的一些ruby文件放入这个文件夹。


现在,我们在lib/core目录下新建一个ruby文件:string.rb

 

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

 
这样core_extensions.rb才会被使用到。

 

现在你可以在需要用的类中调用require_core_ext,这样String类就多出了一个自定义的方法:replace_name,如果需要在整个应用中使用这个方法,可以在application.rb中加入require_core_ext


如果你修改了string.rb文件,那么刷新一下页面就可以看到效果。你可以像这样去使用它:

 

puts "%name%,你好!".replace_name

 

这将会输出如下结果:高海峰, 你好!

   发表时间:2009-11-21  
这个总结很有用,不过最好把ruby和rails的load机制分开讲,ruby本身实际上只有require和load两种
0 请登录后投票
   发表时间:2010-06-09   最后修改:2010-06-09
很有用。投个良好。
require_dependency是rails的。
默默的问下http://devbbs.doit.com.cn/archiver/
这个网址是谁做的,总是抓je的东西。
0 请登录后投票
   发表时间:2010-06-09  
请不要无视 initializers 目录,我说完了。

这是我发的最后一帖, 以后在heroku上建个博客玩去了

4 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间:2010-06-21  
讲的很好, 向高手们学习
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics