我的/ 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
时出现?
答案 0 :(得分:0)
自动加载器的重点在于它通过将模块/类层次结构转换为路径来加载缺少常量。由于您已在两个文件中定义了常量,因此它永远不会自动加载第二个文件。
您需要手动要求foo.rb
。