为了账号安全,请及时绑定邮箱和手机立即绑定

在Rails 4中自动加载库文件

在Rails 4中自动加载库文件

人到中年有点甜 2019-10-13 12:08:24
在Rails 4中自动加载库文件我使用初始化器中的以下行来实现/lib开发过程中的目录:config/initializers/custom.rb:RELOAD_LIBS = Dir[Rails.root + 'lib/**/*.rb'] if Rails.env.development?(来自Rails 3快速提示:在开发模式下自动重新加载lib文件夹)它工作得很好,但是它的效率太低,无法在生产中使用-而不是在每个请求上加载库,我只是想在启动时加载它们。同一个博客另一篇文章描述如何做到这一点:config/application.rb:# Custom directories with classes and modules you want to be autoloadable.config.autoload_paths += % W(#{config.root}/lib)config.autoload_paths += Dir["#{config.root}/lib/**/"]但是,当我切换到它时,即使在开发中,在尝试使用lib函数时也会得到NoMethodError。我的一个库文件的示例:LIB/Extensions.rb:Time.class_eval do   def self.milli_stamp    Time.now.strftime('%Y%m%d%H%M%S%L').to_i  endend呼叫Time.milli_stamp将抛出NoMethodError我知道其他人也回答了类似的问题,但他们似乎都在处理命名约定和其他我以前不需要担心的问题-我的lib类。工作过对于每次请求加载,我只想把它改为-启动装货。什么是正确的方法来做这件事?
查看完整描述

3 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

我认为这可以解决你的问题:

  1. 在……里面config/application.rb:

    config.autoload_paths << Rails.root.join('lib')

    并保留正确的命名约定利布.

    在……里面LIB/foo.rb:

    class Fooend

    在……里面LIB/Foo/bar.rb:

    class Foo::Barend
  2. 如果你真的想在文件里做一些猴子补丁,比如LIB/Extensions.rb,您可以手动要求:

    在……里面配置/初始化器/request.rb:

    require "#{Rails.root}/lib/extensions"

P.S.

  • Rails 3自动加载模块/类比尔·哈丁写的。

  • 要理解Rails到底对自动加载做了什么?
    朗读,阅读Rails自动加载-它是如何工作的,当它不工作时西蒙·科菲。



查看完整回答
反对 回复 2019-10-14
?
哔哔one

TA贡献1854条经验 获得超8个赞

虽然这并不能直接回答这个问题,但我认为完全回避这个问题是一个不错的选择。

为了避免所有的autoload_pathseager_load_paths麻烦,在“app”目录下创建一个“lib”或“misc”目录。按照通常的方式放置代码,Rails将加载文件,就像加载(和重新加载)模型文件一样。


查看完整回答
反对 回复 2019-10-14
  • 3 回答
  • 0 关注
  • 482 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信