Вопрос

Я пытаюсь заселить базу данных в 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 вообще?

Это было полезно?

Решение

Оказывается, документация для 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!

Другие советы

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

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

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

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

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

Это все в документации: https://github.com/carrierwaveuploader/carrierwave/wiki/how-to :-%22upload%22-from-a-local-file

restaurant = Restaurant.create!(name: "McDonald's")
restaurant.logo = Rails.root.join("db/images/mcdonalds_logo.png").open
restaurant.save!

Опираясь на комментарий @Joseph Jaber, это сработало для меня:

Код ниже seeds.rb

20.times do
        User.create!(
            name: "John Smith",
            email: "john@gmail.com",
            remote_avatar_url: (Faker::Avatar.image)
        )
    end

Это создаст 20 пользователей и даст каждому другому изображению аватара.

Я использовал Gem Faker для генерации данных, но все Faker::Avatar.image Действительно возвращает стандартный URL, чтобы вы могли использовать любой URL -адрес по вашему выбору.

Приведенный выше пример предполагает, что пользовательские модели атрибут, где вы храните свои изображения, вызываются avatar

Если бы атрибут назывался изображением, вы бы написали так:

remote_image_url: (Faker::Avatar.image)

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

  1. Комментарий линии Mount_uploader в модели
  2. Заселить данные
  3. Неуместно линию в модели
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top