Rails 自动加载器未加载模块

Rails autoloader not loading module

我的 /lib 文件夹中有以下结构

/lib
   /example
      /foo
         bar.rb
      foo.rb

foo.rb

module Example
   module Foo
      def self.some_methods
      end
   end
end

bar.rb

module Example
    module Foo
        class Bar
           ...
        end
    end
end

然后我在application.rb

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

并在初始化程序中

...
Example::Foo.some_methods
...

我 运行 在尝试 运行 我的测试套件时遇到了问题,因为它似乎在设置 Rails 环境时失败了。它抱怨 some_methodsExample::Foo 上不存在。但是,我可以在没有任何错误的情况下启动本地开发服务器。

使用断点深入研究问题,Example::Foo 模块定义在故障点,但它是空的。我假设自动加载器首先加载 bar.rb(我可以在初始化程序中访问 class 没问题)? Rails 似乎没有尝试加载 foo.rb 因为 Example::Foo 已经被 bar.rb?

定义了

发生了什么事?如果我在初始化程序中需要 foo.rb 它可以工作,但感觉这是一个糟糕的解决方案。另外,知道为什么这个问题只会在 运行ning rake spec 时出现吗?

自动加载器的全部意义在于它通过将 module/class 层次结构转换为路径来加载 缺失的 常量。由于您在两个文件中定义了常量,它永远不会自动加载第二个文件。

您需要手动要求 foo.rb