`ClassName.constants`在Rails应用程序中返回空数组

时间:2014-03-28 19:49:47

标签: ruby-on-rails ruby lazy-loading constants

我正在开发一个Rails 3应用程序,我的lib文件夹中有一个类的层次结构,例如:

lib
├── assets
├── tasks
│   └── import.rake
└── importer
    ├── base.rb
    └── source
        ├── facebook.rb
        ├── google.rb
        └── twitter.rb

我已更新config/application.rb以包含此行:

config.autoload_paths += %W(#{config.root}/lib)

然后在Importer::Base内部,我有一个实例方法试图加载Provider模块中的所有类,例如:

Importer::Source.constants.each do |class_name|
  Importer::Source.const_get(class_name).process
end

lib/importer/base中的三个类具有类似于以下的类层次结构:

module Importer
  module Source
    class Facebook
      # ...
    end
  end
end

当我调用此方法时,Importer::Source.constants最终返回一个空数组。如果我直接按名称引用它们,那么这些类似乎是延迟加载的,但在constants调用中无法访问它们。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

使用@ apneadiving的建议,我可以通过将此行添加到base.rb文件的开头来解决此问题:

Dir[Rails.root.join('lib/importer/source/**/*.rb')].each(&method(:require))