在Rails 4中自动加载lib文件

我在初始化程序中使用以下行来在开发过程中自动载入我的/lib目录中的代码:

configuration/初始化/ custom.rb:

 RELOAD_LIBS = Dir[Rails.root + 'lib/**/*.rb'] if Rails.env.development? 

(来自Rails 3 Quicktip:在开发模式下自动重载库文件夹 )

它效果很好,但在生产中使用效率太低 – 不是每次请求都加载库,而只是想在启动时加载它们。 同一篇博客有另一篇文章描述如何做到这一点:

configuration/ 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函数时,我得到NoM​​ethodErrors。

我的一个lib文件的例子:

LIB / extensions.rb中:

 Time.class_eval do def self.milli_stamp Time.now.strftime('%Y%m%d%H%M%S%L').to_i end end 

调用Time.milli_stamp会抛出NoMethodError

我意识到其他人已经回答了类似的问题,但他们似乎都处理命名约定和其他问题,我以前不必担心 – 我的lib类已经为每个请求加载工作,我只是想改变它到每启动加载。 什么是正确的方法来做到这一点?

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

  1. config / application.rb中

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

    并保持正确的命名约定在lib中

    lib / foo.rb中

     class Foo end 

    lib / foo / bar.rb中

     class Foo::Bar end 
  2. 如果你真的想在lib / extensions.rb文件中做一些猴子补丁,你可以手动要求:

    config / initializers / require.rb中

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

PS

  • Rails 3 Autoload模块/类由比尔·哈丁。

  • 了解Rails究竟做了什么关于自动加载?
    阅读Rails autoloading – 它是如何工作的,什么时候它不是由Simon Coffey编写的。

虽然这不能直接回答这个问题,但我认为完全避免这个问题是一个很好的select。

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

这可能会帮助像我这样的人find这个答案,当寻找Rails如何处理类加载的解决scheme…我发现我必须定义一个名称匹配我的文件名适当的module ,而不是只定义一个类:

在文件lib / development_mail_interceptor.rb (是的,我使用Railscast的代码:))

 module DevelopmentMailInterceptor class DevelopmentMailInterceptor def self.delivering_email(message) message.subject = "intercepted for: #{message.to} #{message.subject}" message.to = "myemail@mydomain.org" end end end 

工作,但如果我没有把类放在一个模块内,它不会加载。

使用config.to_prepare在开发模式下为每个请求加载猴子补丁/扩展。

 config.to_prepare do |action_dispatcher| # More importantly, will run upon every request in development, but only once (during boot-up) in production and test. Rails.logger.info "\n--- Loading extensions for #{self.class} " Dir.glob("#{Rails.root}/lib/extensions/**/*.rb").sort.each do |entry| Rails.logger.info "Loading extension(s): #{entry}" require_dependency "#{entry}" end Rails.logger.info "--- Loaded extensions for #{self.class}\n" 

结束