【问题标题】:`ClassName.constants` returning empty array in Rails app`ClassName.constants` 在 Rails 应用程序中返回空数组
【发布时间】:2014-03-28 19:49:46
【问题描述】:

我正在开发一个 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 调用中无法访问它们。我该如何解决这个问题?

【问题讨论】:

  • 您应该手动要求文件

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


【解决方案1】:

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

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

【讨论】:

  • btw require_dependency 是一种让你的类在开发模式下重新加载的方法,比单纯的 require 更好
猜你喜欢
  • 2020-02-06
  • 1970-01-01
  • 2018-01-18
  • 1970-01-01
  • 1970-01-01
  • 2012-02-27
  • 2017-03-08
  • 1970-01-01
  • 2016-05-27
相关资源
最近更新 更多