Загрузка файла с помощью CarrierWave, Rails 3 - PullRequest
30 голосов
/ 12 октября 2010

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

Ответы [ 6 ]

39 голосов
/ 12 октября 2010

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

Пока ваш загрузчик подключен к вашей модели, используя метод mount_uploader, вы можете заполнять свои модели с помощью carrierwave, используя соответствующий метод open.Это было бы более кратким способом достижения того же самого.В моем случае я перехожу с 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'])
},
{...
2 голосов
/ 15 ноября 2011

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

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

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

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

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

0 голосов
/ 30 мая 2018

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

Код ниже должен быть в seeds.rb

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

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

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

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

Если бы атрибут назывался image, вы бы написали так:

remote_image_url: (Faker::Avatar.image)

0 голосов
/ 11 ноября 2017

Это все в документации: 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!
0 голосов
/ 11 июня 2016

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

  1. Закомментируйте строку mount_uploader в модели
  2. Семя данных
  3. Раскомментируйте строку в модели
...