Rails:未初始化的常量'Product :: CSV'

时间:2014-01-25 06:13:51

标签: ruby-on-rails

我有以下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

4 个答案:

答案 0 :(得分:44)

您需要CSV库。

require 'csv'

class Product < ActiveRecord::Base

  # ...
end

答案 1 :(得分:32)

我今天犯了同样的错误。对于那些有同样问题的人,我想分享一下。

请确保 config / application.rb 中的需要csv 库。

配置/ application.rb中

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或类似内容可能是解决您问题的最简单方法。