免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3393 | 回复: 0
打印 上一主题 下一主题

在rails中如何加载自定义方法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-15 14:08 |只看该作者 |倒序浏览
这是一个我经常看到的被问及的问题,为了一劳永逸,我决定解决它。将自定义的方法加载到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加入需要加载的路径。

举个例子:

Ruby代码
  1. config.load_paths += %W( custom )  
复制代码
这将会加载RAILS_ROOT/custom目录,因此你可以使用该目录下的所有文件。

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

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

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

Ruby代码
  1. class String  
  2.   def replace_name   
  3.     self.gsub(/%name%/, "高海峰")   
  4.   end  
  5. end
复制代码
然后在lib目录下再新建一个ruby文件:core_extensions.rb

Ruby代码
  1. module CoreExtensions
  2.   def require_core_ext
  3.     Dir["#{RAILS_ROOT}/lib/core/*.rb"].each do |f|
  4.       require_dependency f
  5.     end
  6.   end
  7. end
  8. Object.instance_eval { include CoreExtensions }
复制代码
然后在application.rb中加入如下代码:

Ruby代码
  1. include CoreExtensions
复制代码
这样core_extensions.rb才会被使用到。

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

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

Ruby代码
  1. puts "%name%,你好!".replace_name  
复制代码
这将会输出如下结果:高海峰, 你好!

原文转自:http://www.javaeye.com/topic/521123
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP