Ответ 1
Вам потребуется библиотека CSV.
require 'csv'
class Product < ActiveRecord::Base
# ...
end
У меня есть следующий класс 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
Вам потребуется библиотека CSV.
require 'csv'
class Product < ActiveRecord::Base
# ...
end
Сегодня я совершил ту же ошибку. Для тех, у кого такая же проблема, я хотел бы поделиться этим.
Пожалуйста, убедитесь, что вам нужна библиотека csv в config/application.rb.
require 'csv'
Когда вы ссылаетесь на константу в пространстве имен, например Class или Module, по умолчанию Ruby считает, что это имя константы находится под пространством имен.
В вашем случае, когда вы указываете CSV
внутри класса Product
, Ruby будет искать константу Product::CSV
. Это желаемое действие.
Конечно, вы этого не хотите, потому что ваш модуль CSV
находится в верхнем пространстве имен. В этом случае вы должны явно выразить это, добавив ::
перед именем.
::CSV.foreach #.....
Я столкнулся с подобной ошибкой, где некоторое время я мог использовать методы класса в CSV без проблем. Затем, внезапно, я получал неинициализированные постоянные ошибки. Я понял, что многие камни Ruby используют multi_xml
или что-то похожее на жемчужину зависимости, а в качестве побочного эффекта этот жемчуг инициализирует класс CSV при запуске вашего сервера. Если вы удалите драгоценный камень, который этого требует, вы начнете получать исключения, где бы вы ни полагались на этот побочный эффект. Вы можете его исправить, написав require 'csv'
в каждом файле, но использование multi_xml
gem или что-то подобное, вероятно, самое легкое решение вашей проблемы.