Подтвердить что ты не робот

Rails: Неинициализированная константа 'Product:: CSV'

У меня есть следующий класс 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
4b9b3361

Ответ 1

Вам потребуется библиотека CSV.

require 'csv'

class Product < ActiveRecord::Base

  # ...
end

Ответ 2

Сегодня я совершил ту же ошибку. Для тех, у кого такая же проблема, я хотел бы поделиться этим.

Пожалуйста, убедитесь, что вам нужна библиотека csv в config/application.rb.

конфиг /application.rb

require 'csv'

Ресурсы

Ответ 3

Когда вы ссылаетесь на константу в пространстве имен, например Class или Module, по умолчанию Ruby считает, что это имя константы находится под пространством имен.

В вашем случае, когда вы указываете CSV внутри класса Product, Ruby будет искать константу Product::CSV. Это желаемое действие.

Конечно, вы этого не хотите, потому что ваш модуль CSV находится в верхнем пространстве имен. В этом случае вы должны явно выразить это, добавив :: перед именем.

::CSV.foreach #.....

Ответ 4

Я столкнулся с подобной ошибкой, где некоторое время я мог использовать методы класса в CSV без проблем. Затем, внезапно, я получал неинициализированные постоянные ошибки. Я понял, что многие камни Ruby используют multi_xml или что-то похожее на жемчужину зависимости, а в качестве побочного эффекта этот жемчуг инициализирует класс CSV при запуске вашего сервера. Если вы удалите драгоценный камень, который этого требует, вы начнете получать исключения, где бы вы ни полагались на этот побочный эффект. Вы можете его исправить, написав require 'csv' в каждом файле, но использование multi_xml gem или что-то подобное, вероятно, самое легкое решение вашей проблемы.