我有一个模块,其中一个类与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
时,我收到一个指示:
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.rb
有config.autoload_paths << Rails.root.join('app', 'services', 'generator')
,以确保服务类自动加载应用的其余部分。
如何在不与班级名称冲突的情况下调用标准库CSV类?
答案 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