Использование Paperclip в seeds.rb

Пусть говорит, что у меня есть следующая запись в файле seeds.rb:

Image.create(:id => 52, :asset_file_name => "somefile.jpg", :asset_file_size => 101668, :asset_content_type => "image/jpeg", :product_id => 52)

Если я засеваю его, он пытается обработать указанное изображение, я получаю эту ошибку:

No such file or directory - {file path} etc...

Мои изображения скопированы, поэтому мне не нужно их создавать; но мне нужна запись. Я не могу прокомментировать директиву paperclip в моей модели; то это работает; но я думаю, что может быть другое решение.

Есть ли еще один образец для его выполнения? Или поворот, чтобы сообщить скрепки не обрабатывать изображение?

Ответ 1

Вместо того, чтобы напрямую устанавливать столбцы активов, попробуйте использовать скрепку и установите ее как объект Ruby File.

Image.create({
  :id => 52, 
  :asset => File.new(Rails.root.join('path', 'to', 'somefile.jpg')),
  :product_id => 52
})

Ответ 2

Другой ответ здесь, безусловно, работает для большинства ситуаций, но в некоторых случаях может оказаться лучше предоставить UploadedFile а не File. Это более точно подражает тому, что Paperclip получит от формы и предоставит некоторые дополнительные функции.

image_path = "#{Rails.root}/path/to/image_file.extension"
image_file = File.new(image_path)

Image.create(
  :id => 52,
  :product_id => 52,
  :asset => ActionDispatch::Http::UploadedFile.new(
    :filename => File.basename(image_file),
    :tempfile => image_file,
    # detect the image mime type with MIME if you can't provide it yourself.
    :type => MIME::Types.type_for(image_path).first.content_type
  )
)

Хотя этот код несколько сложнее, он имеет право правильно интерпретировать документы Microsoft Office с расширениями.docx,.pptx или.xlsx, которые, если они прикреплены с использованием объекта File, будут загружены в виде zip файлов.

Это особенно важно, если ваша модель разрешает документы Microsoft Office, но не разрешает zip файлы, потому что проверки в противном случае не будут выполнены, и ваш объект не будет создан. Это не повлияло бы на ситуацию с ОП, но это повлияло на мое, и поэтому я хочу оставить свое решение на тот случай, если кому-то это понадобится.