Rails自动加载器没有加载模块

时间:2017-07-18 10:16:16

标签: ruby-on-rails ruby ruby-on-rails-4.2

我的/ 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_methods上不存在Example::Foo。但是,我可以在没有任何错误的情况下启动本地开发服务器。

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

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

1 个答案:

答案 0 :(得分:0)

自动加载器的重点在于它通过将模块/类层次结构转换为路径来加载缺少常量。由于您已在两个文件中定义了常量,因此它永远不会自动加载第二个文件。

您需要手动要求foo.rb