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_methods
在 Example::Foo
上不存在。但是,我可以在没有任何错误的情况下启动本地开发服务器。
使用断点深入研究问题,Example::Foo
模块定义在故障点,但它是空的。我假设自动加载器首先加载 bar.rb
(我可以在初始化程序中访问 class 没问题)? Rails 似乎没有尝试加载 foo.rb
因为 Example::Foo
已经被 bar.rb
?
定义了
发生了什么事?如果我在初始化程序中需要 foo.rb
它可以工作,但感觉这是一个糟糕的解决方案。另外,知道为什么这个问题只会在 运行ning rake spec
时出现吗?
自动加载器的全部意义在于它通过将 module/class 层次结构转换为路径来加载 缺失的 常量。由于您在两个文件中定义了常量,它永远不会自动加载第二个文件。
您需要手动要求 foo.rb
。
我的 /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
(我可以在初始化程序中访问 class 没问题)? Rails 似乎没有尝试加载 foo.rb
因为 Example::Foo
已经被 bar.rb
?
发生了什么事?如果我在初始化程序中需要 foo.rb
它可以工作,但感觉这是一个糟糕的解决方案。另外,知道为什么这个问题只会在 运行ning rake spec
时出现吗?
自动加载器的全部意义在于它通过将 module/class 层次结构转换为路径来加载 缺失的 常量。由于您在两个文件中定义了常量,它永远不会自动加载第二个文件。
您需要手动要求 foo.rb
。