`
jsntghf
  • 浏览: 2482554 次
  • 性别: 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两种

相关推荐

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

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

    hotwire-rails:在Ruby on Rails应用程序中使用Hotwire

    这样可以实现快速的首次加载页面,将模板呈现在服务器上,并允许在任何编程语言中实现更简单,更高效的开发体验,而不会牺牲与传统单页面应用程序相关的任何速度或响应能力。 Hotwire的核心是Turbo。 一组免费的...

    turbo-rails:在Ruby on Rails应用中使用Turbo

    它使您可以将页面分成独立的框架,这些框架可以延迟加载并作为独立的组件运行。 最后,它可以帮助您仅使用HTML和一组类似于CRUD的容器标签进行部分页面更新。 这三种技术将许多Web应用程序需要编写的自定义...

    gunzel:深入了解下一个Rails项目的设置时间

    好东西Rails 4.2 使用 , , 和自定义视图脚手架模板使用“和“自定义模型和控制器支架模板,和在部署的和预配置加载更多...用法Gunzel作为定制的生成的Rails应用程序框架分发(不是作为,这很好,但是将这么多的...

    deskjockey:Zendesk的自定义反馈和支持小部件

    首先,在某个地方设置并运行此Rails项目。 它不需要数据库或其他任何特殊的东西。 然后,添加标记以加载javascript并为其提供一个点击链接(您可以根据自己的喜好对此链接进行样式设置): < script id =" ...

    futurism:通过CableReady的惰性加载Rails局部

    通过CableReady的惰性加载Rails局部 :police_car_light: 未来主义仍处于1.0之前的状态。 我希望保持API向后兼容,但我不能保证 :police_car_light: 照片摄于 目录 大事记 安装手动安装 验证 测验 陷阱 贡献 执照...

    Rails-Annex-Gem:附件CMS的CMS宝石

    全球包容性对于全局包含,您可以将两个资产添加到您的应用程序文件中: 在application.css中,这将加载编校编辑器所需的样式。 它们仅应最小程度地干扰您自己的应用程序样式。 *= require annex 在applic

    log_weasel:具有共享事务ID的Instrument Rails和Resque可以跟踪跨应用程序和应用程序实例的工作单元的执行

    要在Rails日志中查看Log Weasel事务ID,请使用提供的BufferedLogger或自定义记录器的格式以包括LogWeasel::Transaction.id 。 YourApp::Application.configure do config.log_weasel.key = 'YOUR_APP' # Opt

    devise_with_twitter:使用 devise 通过 Twitter 和 Neo4j 对用户进行身份验证的示例 Rails 应用程序

    设置: 更新`配置/初始化/ devise.rb`...在`config/application.rb` 上,在预编译资产时强制应用程序不访问数据库或加载模型。 您可以通过运行¶ ↑将设计视图(用于自定义)复制到您的应用程序 rails g devise: views

    active_loaders:Ruby库自动为您的Active Model Serializer预加载数据

    主动加载器自动为您的序列化程序预加载关联为虚拟属性(查询属性)指定自定义SQL代码段以可重用的方式编写自定义预加载逻辑注意:该gem的API仍然不稳定,并且可能在版本之间进行更改。 该项目使用语义版本控制,但是...

    dhtmlxGridk 中文文档

    有了一个新的皮肤,在2.5版 本中引入,所有DHTMLX组件了光滑和干净的外观,它可以完全匹配任何现代的网站或应用程序的设计。 dhtmlxGrid表格展现通过加载XML文件来载入表头、表尾、表格数据实现展现、操作、回写功能...

    plates:移动应用程序可计算如何在杠铃的两侧加载板块

    该项目是通过引导的。... 使用AJAX请求获取数据与API后端集成节点Ruby on Rails 在开发中代理API请求配置代理后出现“无效的主机头”错误手动配置代理配置WebSocket代理在开发中使用HTTPS 在服务器上生成动态<met

    Haven是使用Ruby on Rails构建的可自我托管的私人博客-Ruby开发

    Haven是一个使用Ruby on Rails构建的简单博客应用程序(以前称为SimpleBlog)Haven Haven是一个使用Ruby on Rails构建的简单博客应用程序(以前称为SimpleBlog),这激发了一些启发性的思想:隐私优先。 这是为了与...

    ProjectTemplate:R项目的模板实用程序,可提供骨架项目

    而且,ProjectTemplate遵循Rails的首选约定而不是配置的方法:自动数据和库加载以及自动测试很容易工作,因为对代码中使用的目录结构和命名约定进行了假设。 您可以根据需要自定义代码库,但是必须编辑Project...

    Fairbnb:受 Airbnb 启发并基于 Rails 构建的免费度假租赁应用程序

    基于 Rails 后端、React/Redux 前端和 PostgreSQL 数据库的 Airbnb 克隆 主要特征 浏览所有可用的现货清单 使用集成地图功能按位置缩小搜索范围 通过应用程序预订位置并立即收到确认 动态用户界面 针对各种视口优化...

    冇问题.zip

    之后我清理重构了这套代码,将两个网站合并到了一套系统中,并使这套系统可以增加新的站点,且站点可以自定义主题等等一系列功能。此后根据根据黑老大的要求,开发完了手机版网站,在手机市场爆发之前站住了脚跟。其...

    Stromble:使用ReactRedux和Ruby on Rails构建的全栈单页应用程序-社交媒体平台,允许用户跟踪运行和骑车数据

    该堆栈包括一个结合了PostgreSQL数据库的Ruby-on-Rails后端和一个React-Redux前端。 Google Maps Directions API可用于创建和显示用户创建的跑步/骑行路线。 Google Static Maps API与Google Elevation Services...

    urlscheme_vim_in_iterm:一个小应用程序打开特殊的“ viminiterm

    是一种RubyGem,可以在开发期间在Rails应用程序中提供更好的错误。 它提供的一项功能是能够在您选择的编辑器中的堆栈跟踪中,在有问题的行中打开文件。 它通过使用自定义方案(即“ txmt”,“ subl”,“ mvim”)...

    visualifter:举重展示台

    在浏览器中打开index.html 特征 创建具有各种重复范围,设置和重量载荷的举升机 排列“块”以可视化工作量并动态构建程序 保存并加载锻炼 贡献 如果您有任何扩展或改进的想法,请随时报告错误或创建请求请求。 作者 ...

    user_notif:用户通知gem

    UserNotif去做将属类添加到自定义模型(将其添加到初始化程序中,并像这样将其加载到notif.rb中的属类UserNotif.model_name ...中)安装将此行添加到应用程序的Gemfile中: gem 'user_notif' 然后执行: $ bundle...

Global site tag (gtag.js) - Google Analytics