LoadError:无法加载常量

时间:2015-01-29 19:38:19

标签: ruby-on-rails ruby csv

我有一个模块,其中一个类与ruby标准库中的类共享一个名称。我的类需要调用类,我得到一个LoadError。

require 'csv'

module Generator
  class CSV
    def generate_and_write
      ::CSV.open(filename) {
        # some functionality
      }
    end
  end
end

当我调用Generator::CSV.new.generate_and_write时,我收到一个指示:

的LoadError异常
Unable to autoload constant Generator::CSV, expected /app/services/generator/csv.rb to define it (LoadError)

例外来自:

vendor/bundle/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:495:in 'load_missing_constant'

调试应用程序时,加载类时会抛出RunTime异常:

:: CSV = {RunTimeError}自动加载常量CSV时检测到循环依赖。

我的config/application.rbconfig.autoload_paths << Rails.root.join('app', 'services', 'generator'),以确保服务类自动加载应用的其余部分。

如何在不与班级名称冲突的情况下调用标准库CSV类?

2 个答案:

答案 0 :(得分:0)

首先,我相信当前版本的rails自动加载app/**/*,因此您不需要为自动加载添加任何内容。

其次,问题是Rails Inflector需要一个名为csv.rb的文件来定义一个名为CSV而不是Csv的类。如果您将类重命名为CSV,则应该正常加载。

要调用该类内部的基础CSV,请使用范围运算符::CSV指定顶级CSV而不是Generator::CSV

答案 1 :(得分:0)

我通过将Generator模块重命名为FileGenerators来解决了这个问题。 (我确信FileGenerator也可以工作,但是有一个复数模块更有意义,因为它包含多个FileGenerators。)

module FileGenerators
  class CSV < FileGenerators::Base
    def generate_and_write
      ::CSV.open {
        # ...
      }
    end