2010-10-11 2 views
29

Я пытаюсь засеять базу данных в Rails 3 с помощью изображений с использованием CarrierWave, однако ничто из того, что я пытаюсь, похоже, не имеет необходимости загружать их вручную.Загрузка загружаемых файлов с помощью CarrierWave, Rails 3

pi = ProductImage.new(:product => product) 
pi.image = File.open(File.join(Rails.root, 'test.jpg')) 
pi.store_image! # tried with and without this 
product.product_images << pi 
product.save! 

Кто-нибудь знает, как посеять, используя CarrierWave?

+0

Извините, если я ушел с отметки, но вообще-то 'pi' зарезервированное слово? – danjah

+0

Нет, pi в ruby ​​представляется как константа, чувствительная к регистру как 'PI'. Тем не менее интересная мысль. ;] –

+0

Thats 'Math :: PI 'кстати. ;] –

ответ

38

Оказалось, что документация для CarrierWave немного ошибочна. Существует более современный кусок кода in the README at the GitHub repository for the project.

В двух словах, хотя:

pi = ProductImage.create!(:product => product) 
pi.image.store!(File.open(File.join(Rails.root, 'test.jpg'))) 
product.product_images << pi 
product.save! 
+10

Это также возможно сделать в одной строке при желании: 'ProductImage.create! (: Product => product, image: File.open (File.join (Rails.root, 'test.jpg'))) ' – Marcus

+1

Также возможно выполнить все действие в одной строке' product.product_images.create! (Image: File.open (File.join (Rails.root, 'test.jpg '))) ' – Ninz

2

Вот пример скрипта, который включен в seed.rb файл для одного из моих проектов. Я уверен, что его можно улучшить, но он обеспечивает хороший рабочий пример.

Все активы, которые я вытаскиваю, хранятся в приложении/активах/изображениях, и у них есть имена, соответствующие именам моих объектов Info (после того, как я заменил пробелы символами подчеркивания и именами).

Да, это звучит неэффективно, но, помимо размещения этих ресурсов на FTP где-то, это лучшее решение, которое я нашел для удаленного сервера, чтобы загрузить файлы прямо на S3 с помощью Carrierwave и Fog.

Моя информационная модель имеет ассоциацию has_one модели Gallery, которая имеет ассоциацию has_many с моделью фотографий. Загрузочный загрузчик Carrierwave монтируется в столбце «файл» (строка) этой модели.

Info.all.each do |info|    
    info_name = info.name.downcase.gsub(' ', '_') 
    directory = File.join(Rails.root, "app/assets/images/infos/stock/#{info_name}") 

    # making sure the directory for this service exists 
    if File.directory?(directory) 
    gallery = info.create_gallery 

    Dir.foreach(directory) do |item| 
     next if item == '.' or item == '..' 
     # do work on real items 
     image = Photo.create!(gallery_id: gallery.id) 
     image.file.store!(File.open(File.join(directory, item))) 
     gallery.photos << image 
    end 

    info.save! 

    end 
end 

Это работает безупречно для меня, но в идеале я бы не упаковать файлы, которые я загружаю в S3 в папке активов. Я более чем открыт для предложений & улучшений.

8

До тех пор, пока ваш загрузчик подключен к вашей модели, используя метод mount_uploader, вы можете засеять ваши модели несущей волной с использованием соответствующего открытого метода. Это было бы более сжатым способом достижения того же. В моем случае я высева из URL:

Game.create([ 
{ 
    :title => "Title", 
    :uuid_old => "1e5e5822-28a1-11e0-91fa-0800200c9a66", 
    :link_href => "link_href", 
    :icon => open("http://feed.namespace.com/icon/lcgol.png"), 
    :updated_at => "2011-01-25 16:38:46", 
    :platforms => Platform.where("name = 'iPhone'"), 
    :summary => "Blah, blah, blah...", 
    :feed_position => 0, 
    :languages => Language.where("code = 'de'"), 
    :tags => Tag.where(:name => ['LCGOL', 'TR', 'action']) 
}, 
{... 
+6

Вместо использования вместо этого' open', 'remote_ [имя атрибута] _url'. –

-1

Самое простое решение для меня было:

  1. Комментарий-вне mount_uploader линии в модели
  2. Seed данные
  3. Раскоментируйте линия в модели
Смежные вопросы