Question

Je suis en train de semer une base de données dans Rails 3 avec des images en utilisant CarrierWave, mais rien que j'essaie semble fonctionner à court d'avoir à les télécharger tout à la main.

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!

Quelqu'un sait comment les graines à l'aide CarrierWave du tout?

Était-ce utile?

La solution

Il se trouve que la documentation CarrierWave est un peu mal. Il y a un plus à jour morceau de code dans le README au dépôt GitHub du projet .

En un mot, si:

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

Autres conseils

Tant que votre Uploader est monté sur votre modèle, en utilisant la méthode mount_uploader, vous pouvez semer vos modèles avec carrierwave en utilisant la méthode ouverte pertinente. Ce serait un moyen plus concis de réaliser la même chose. Dans mon cas, je suis ensemençant à partir d'une 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'])
},
{...

Voici un exemple de script I incorporé dans un fichier seed.rb pour un de mes projets. Je suis sûr qu'il peut être amélioré, mais il est un bon exemple de travail.

Tous les actifs Je tire sont stockés dans les app / assets / images et ils ont des noms qui correspondent aux noms de mes objets d'informations (après que je remplacer les espaces par des underscores et downcase les noms).

Oui, il ne semble inefficace, mais à part de mettre ces actifs sur un FTP somehwhere, c'est la meilleure solution que je trouve mon serveur distant pour pouvoir télécharger les fichiers directement à S3 en utilisant Carrierwave et brouillard.

modèle Mes infos a une association has_one à un modèle Gallery, qui a une association has_many à un modèle photo. Le téléchargeur Carrierwave est monté sur la colonne (chaîne) « file » de ce modèle.

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

Cela fonctionne parfaitement pour moi, mais idéalement je pas à emballer les fichiers que je suis à S3 ajout dans les actifs dossier. Je suis plus ouvert aux suggestions et améliorations.

Il est dans la documentation: 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!

Miser sur le commentaire de @joseph jaber cela a fonctionné un régal pour moi:

Le code ci-dessous devraient être dans seeds.rb

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

Cela va créer 20 utilisateurs et donner à chacun une autre image de l'avatar.

Je l'ai utilisé la pierre précieuse de Faker pour générer les données mais tout est Faker::Avatar.image ne renvoie une URL standard, vous pouvez utiliser une URL de votre choix.

L'exemple ci-dessus suppose que les modèles d'attribut utilisateur où vous vous stockez des images est appelée avatar

Si l'attribut a été appelé image que vous écrivez comme ceci:

remote_image_url: (Faker::Avatar.image)

La solution pour moi était plus facile:

  1. en commentaire la ligne mount_uploader dans le modèle
  2. Graine données
  3. Décommentez la ligne dans le modèle
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top