在lib目录中自动加载常量时检测到循环依赖性

时间:2018-03-28 18:51:54

标签: ruby-on-rails ruby

在Rails中,有一个lib目录。默认情况下不会自动加载。因此,当您加载Rails环境时,将无法在运行时知道此文件夹中的所有模块和类。我试图在application.rb

中自动加载lib
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继承。如何避免这种错误?

1 个答案:

答案 0 :(得分:1)

我对自动加载没什么可说的,魔术从来没有对我起作用,我试图尽可能避免它。

对于后者,错误原因很明显:您尝试加载需要定义PbFactory类的Factory(因为它是从它派生的),并且尚未定义。要解决问题,请将您的

Dir["*_factory.rb"].each {|file| require_relative file }
Factory类声明之后