在Rails中,有一个lib目录。默认情况下不会自动加载。因此,当您加载Rails环境时,将无法在运行时知道此文件夹中的所有模块和类。我试图在application.rb
:
config.autoload_paths += %W(#{config.root}/app/models/ckeditor #{config.root}/lib)
但它不起作用。它不会加载我想要加载的库中的模块和类。
文件结构如下:
\lib
\docket
\practice_factory
factory.rb
pa_factory.rb
我在factory.rb中有这个:
module Docket
module PracticeFactory
class Factory
def self.practice_methods
descendants.collect {|descendant| descendant.practice_methods }
end
end
end
end
在pa_factory.rb中:
module Docket
module PracticeFactory
class PaFactory < Factory
def self.practice_methods
{
some: 'data',
more: 'stuff'
}
end
end
end
end
当我加载rails控制台时,运行时我得到空数组:
Docket::PracticeFactory::Factory.practice_methods
=> []
数组为空的原因是因为PaFactory未加载到内存中。尽管事实上我将lib包含在自动加载路径中!那么为什么不自动加载#1?
另外,我将以下内容添加到factory.rb:
Dir["#{Rails.root}/lib/docket/practice_factory/*_factory.rb"].each {|file| require file }
它给了我错误:
RuntimeError:自动加载常量时检测到循环依赖性 案卷:: PracticeFactory ::厂
有趣的错误,我正在使用* _factory.rb加载文件,而factory.rb没有下划线,但那些其他文件确实从Factory继承。如何避免这种错误?
答案 0 :(得分:1)
我对自动加载没什么可说的,魔术从来没有对我起作用,我试图尽可能避免它。
对于后者,错误原因很明显:您尝试加载需要定义PbFactory
类的Factory
(因为它是从它派生的),并且尚未定义。要解决问题,请将您的
Dir["*_factory.rb"].each {|file| require_relative file }
> Factory
类声明之后。