【问题标题】:Rails doesn't load my module from libRails 不会从 lib 加载我的模块
【发布时间】:2012-10-23 13:15:27
【问题描述】:

我的 Rails 3.2 应用程序的 lib 文件夹中有一堆自定义类:即扩展 ActiveRecord 等。一切正常。

但是我正在尝试向 FileUtils 添加几个自定义方法,即

module FileUtils
  def last_modified_file(path='.')
     # blah ...    
  end
end

我把它放在 lib/file_utils.rb 在我的 application.rb 我有

config.autoload_paths += %W(#{config.root}/lib)

我的其他自定义类已加载,但未加载模块。

我读到 (Best way to load module/class from lib folder in Rails 3?) 我应该在模块内定义一个类以便 Rails 拾取它,并且根据 FileUtils.class - 它应该是 Object

所以我尝试了

module FileUtils
  class Object 
    def last_modified_file(path='.')
       # blah ...    
    end
  end
end

但这也不起作用。

但是,当我启动 irb 并粘贴我的代码时,它有效地将我的新代码放入对象中并重新包含我的模块 - 它工作正常。

我在这里错过了什么?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 module


    【解决方案1】:

    您的补丁永远不会被加载,因为只有在 Rails 找不到常量时才会调用自动加载。由于FileUtils 常量已经存在,因此永远不会调用自动加载器,并且永远不会加载您的文件。

    只需从初始化程序中要求它。

    require File.join(Rails.root, "lib/file_utils.rb")
    

    【讨论】:

    • 这就是我现在正在做的事情。我有一个初始化器require_libs.rb,用于一些需要特别需要的宝石。 require "#{Rails.root}/lib/file_utils.rb"; include FileUtils 。所以你是说没有另一种 Rails 的“自动”方式来做到这一点?
    • 正确。自动加载仅适用于尚不存在的常量。当遇到丢失的常量时,Rails 会在自动加载路径中搜索与该常量名称的蛇大小写版本匹配的文件并加载它。
    猜你喜欢
    • 1970-01-01
    • 2018-09-15
    • 2023-03-09
    • 2011-03-22
    • 1970-01-01
    • 2011-09-15
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多