`
jsntghf
  • 浏览: 2527701 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

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

阅读更多

这是一个我经常看到的被问及的问题,为了一劳永逸,我决定解决它。将自定义的方法加载到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

 

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

分享到:
评论
7 楼 mewleo 2010-06-21  
收藏一下,还没用到过
6 楼 gokure 2010-06-21  
讲的很好, 向高手们学习
5 楼 此乃马甲 2010-06-10  
咕~~(╯﹏╰)b
4 楼 Hooopo 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
3 楼 下一站,火星 2010-06-09  
请不要无视 initializers 目录,我说完了。

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

2 楼 orcl_zhang 2010-06-09  
很有用。投个良好。
require_dependency是rails的。
默默的问下http://devbbs.doit.com.cn/archiver/
这个网址是谁做的,总是抓je的东西。
1 楼 fsword 2009-11-21  
这个总结很有用,不过最好把ruby和rails的load机制分开讲,ruby本身实际上只有require和load两种

相关推荐

    关于rails学习中分页的示例

    在Rails开发中,分页是常见的功能,用于处理大量数据并优化用户体验。当我们从数据库查询数据时,一次性加载所有记录可能会导致性能问题,尤其是当数据量庞大时。因此,分页成为了解决这一问题的关键技术。这篇关于...

    关于rails 3.1 cucumber-rails 1.2.0

    总的来说,了解和熟练掌握Rails 3.1和Cucumber-Rails 1.2.0的用法,对于任何希望在Ruby on Rails环境中进行高效、高质量开发的团队来说都是至关重要的。通过阅读相关的博客文章(如给出的链接),开发者可以深入学习...

    Ruby on Rails 指南 v5.0.1 中文版

    - **在Rails中使用ActionView**:指导如何在Rails应用中集成ActionView。 - **模板、局部视图和布局**:说明如何创建和使用模板、局部视图以及布局。 - **局部布局**:介绍局部视图的布局方式。 - **视图路径**:...

    Rails 3 in Action

    4. **路由**:Rails的路由系统允许灵活地定义URL到控制器动作的映射,书中介绍了如何设置资源路由、命名路由和自定义路由规则。 5. **ActiveRecord**:详述了ActiveRecord是如何作为对象关系映射(ORM)层工作的,...

    Rails进行敏捷Web开发(所有版本的源码rails3.0-4.0)

    在“Rails进行敏捷Web开发(所有版本的源码rails3.0-4.0)”中,包含了Rails从3.0到4.0各个主要版本的源代码,这些版本的变迁反映了Rails框架在不同阶段的发展和改进。 1. Rails 3.0: Rails 3是重大升级,引入了...

    rails-api-4.0.0

    在Rails 4.0.0中,引入了专门针对API开发的Rails API模式,为开发者提供了构建高效、可维护的RESTful API的工具。 一、Rails API模式的核心特点: 1. 轻量级:Rails API模式去掉了不必要的视图层,使得应用更加轻便...

    Ruby on Rails插件

    开发者可以使用`rapt search`命令查找特定功能的插件,例如在Rails项目中添加日历功能的插件。 Rails插件极大地丰富了Rails的功能,使得开发者能够根据项目需求定制和扩展框架,提高了开发效率和代码复用性。通过...

    Ruby-RailsFootnotes在每一个Rails页脚展示应用程序的相关信息方便调试

    在解压缩的`rails-footnotes-master`文件中,包含了Rails Footnotes的源码,如果你有兴趣深入研究或者想要自定义功能,可以查看其中的Ruby代码,包括配置选项和视图模板。通过阅读源码,你可以了解到这个插件是如何...

    Ruby-HighVoltage容易在Rails应用程序中包含静态页面

    **Ruby-HighVoltage在Rails应用中的使用** High Voltage 是一个Ruby on Rails的gem,它使得在Rails应用中管理和展示静态页面变得极其简单。这个库主要针对那些需要在Rails环境中创建和维护非数据库驱动的静态内容的...

    The Rails 4 Way

    - 在Rails 4中,Bundler已经成为标准配置的一部分,对于维护项目的依赖性至关重要。 2. **启动与应用设置** - 这部分涵盖了如何配置Rails应用程序的基本设置,包括数据库连接、邮件服务器等。 - 还包括了如何...

    ruby on rails 3.1.0数据库查询方法汇总

    - **注意**:`where` 方法支持懒加载,只有在真正需要数据时才会从数据库获取数据。 8. **分页和排序**: - `Category.limit(5).all`:限制查询结果的数量。 - `Category.offset(2).limit(3)`:从第 3 条记录...

    Rails的自动完成分页插件

    在这个场景中,我们关注的是Rails的自动完成、文件上传、分页以及上传进度管理相关的插件。让我们详细了解一下这些关键知识点: 1. **Rails 自动完成**: 自动完成是一种功能,允许用户在输入框中键入时提供预填...

    ruby on rails 3

    Ruby on Rails 3 是一个基于Ruby编程语言的开源Web应用程序框架,它遵循MVC(Model-...提供的文档如"Ruby192和Rails3.0.3的新征程.doc"和"rails3入门教程.pdf"等,将有助于深入理解这一框架及其在实际项目中的应用。

    通过CableReady的惰性加载Rails局部-Ruby开发

    通过CableReady未来派的惰性加载Rails局部函数通过CableReady用法的懒加载Rails局部函数与模板自定义中的帮助程序一起使用 (以 或一个 被渲染。 这些自定义元素具有附加的IntersectionObserver,它将把签名的全局ID...

    关于rails的services层

    例如,我们可以在`Initializer.rb`中定义一个方法,该方法扫描`app/services`目录,自动加载所有服务对象,确保它们在应用启动时可用: ```ruby # config/initializers/service_loader.rb Dir.glob(Rails.root.join...

    Rails Best Practices

    **Rails最佳实践** Rails,全称Ruby on Rails,是一个基于Ruby语言的开源Web应用程序框架,遵循MVC(模型-视图-控制器)架构模式。...在实际开发过程中,不断学习和积累经验,才能更好地驾驭Rails这个强大的框架。

    rails-builds-test-源码.rar

    9. **初始化文件(Initializers)**:`config/initializers`目录下的文件在Rails启动时执行,常用来设置全局配置或加载自定义代码。 10. **Scaffolding**:Rails提供了一种快速创建CRUD(创建、读取、更新、删除)...

    ruby on rails开发

    在`config/routes.rb`文件中定义路由规则,设置资源路由和自定义路由。 8. **生成资源** `rails generate`命令可以自动生成模型、控制器、迁移文件等。例如,`rails generate scaffold User name:string email:...

    threejs-rails-源码.rar

    在Rails的 erb 文件中,可以使用 `<%= javascript_tag do %>` 包裹Three.js的初始化代码,确保在页面加载完成后执行。 在Rails的控制器(controllers)中,可以处理与3D场景相关的数据,例如从数据库获取模型信息,...

    ruby for rails

    在本书中,作者详细介绍了Ruby的基础知识,包括变量、常量、方法、类、模块等核心概念,以及Ruby的元编程特性,如对象的反射和自定义类加载机制。这些内容对于理解Rails框架的工作原理至关重要,因为Rails充分利用了...

Global site tag (gtag.js) - Google Analytics