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

Загрузка загружаемых файлов с помощью CarrierWave, Rails 3

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

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?

4b9b3361

Ответ 1

Выключает документацию для CarrierWave, немного ошибочно. В README в репозитории GitHub для проекта есть более современный фрагмент кода .

В двух словах:

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

Ответ 2

Пока ваш загрузчик подключается к вашей модели, используя метод 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'])
},
{...

Ответ 3

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

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

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

Моя модель Info имеет ассоциацию has_one с моделью галереи, которая имеет ассоциацию 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 в папке с ресурсами. Я более чем открыт для предложений и улучшений.

Ответ 5

Самое легкое решение для меня было: 1. закомментируйте строку mount_uploader в модели 2. Выделите данные 3. Раскомментируйте строку в модели