我有以下Product类,它引发uninitialized constant Product::CSV
例外。
class Product < ActiveRecord::Base
has_attached_file :photo, :styles => { :small => "150*150>" }
def self.import(file)
CSV.foreach(file.path, headers: true) do |row|
product = find_by_id(row["id"]) || new
product.attributes = row.to_hash.slice(*accessible_attributes)
product.save!
end
end
end
答案 0 :(得分:44)
您需要CSV库。
require 'csv'
class Product < ActiveRecord::Base
# ...
end
答案 1 :(得分:32)
我今天犯了同样的错误。对于那些有同样问题的人,我想分享一下。
请确保 config / application.rb 中的需要csv 库。
require 'csv'
答案 2 :(得分:1)
当您在命名空间中引用常量时,比如Class或Module,默认情况下,Ruby认为此常量名称在命名空间下。
在您的情况下,当您在CSV
类中提及Product
时,Ruby将查找Product::CSV
常量。这是理想的行动。
当然你不希望这样,因为你的CSV
模块位于顶级命名空间。在这种情况下,您必须通过在名称前添加::
来明确表达。
::CSV.foreach #.....
答案 3 :(得分:1)
我遇到了类似的错误,有一段时间,我可以在CSV上使用类方法没有问题。然后,突然间,我得到了未初始化的不断错误。我意识到许多Ruby宝石使用multi_xml
或类似的东西作为依赖宝石,并且作为一个副作用来影响gem在服务器启动时初始化CSV类。如果你删除了需要这个的宝石,你将开始在你依赖这个副作用的地方获得例外。您可以在每个文件中编写require 'csv'
来修补它,但使用multi_xml
gem或类似内容可能是解决您问题的最简单方法。