Domanda

Sto cercando di seminare un database in Rails 3 con immagini utilizzando CarrierWave, però niente provo sembra breve lavoro di dover caricare tutti a mano.

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!

Qualcuno sa come seme usando CarrierWave a tutti?

È stato utile?

Soluzione

Si scopre che la documentazione per CarrierWave è leggermente sbagliata. C'è un più aggiornato pezzo di codice nel README al repository GitHub del progetto .

In poche parole, però:

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

Altri suggerimenti

Fino a quando il vostro uploader è montato al modello, utilizzando il metodo mount_uploader, è possibile seminare i vostri modelli con carrierwave utilizzando il metodo aperto di riferimento. Questo sarebbe un modo più conciso di raggiungere la stessa cosa. Nel mio caso sto semina da un 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'])
},
{...

Ecco un esempio script che ho incorporato in un file seed.rb per uno dei miei progetti. Sono sicuro che può essere migliorato ma fornisce un buon esempio di lavoro.

Tutti i beni sto tirando vengono memorizzati all'interno della app / attività / immagini e hanno nomi corrispondenti ai nomi dei miei Info oggetti (dopo sostituisco spazi con sottolineature e downcase i nomi).

Si fa suono inefficiente, ma a parte mettere quelle risorse su un server FTP somehwhere, è la soluzione migliore che ho trovato per il mio server remoto per essere in grado di caricare i file direttamente a S3 utilizzando Carrierwave e nebbia.

Il mio modello di Informazioni ha un'associazione has_one ad un modello di galleria, che ha un'associazione has_many ad un modello di foto. L'uploader Carrierwave è montato sul 'file' (stringa) di colonna di quel modello.

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

Questo funziona perfettamente per me, ma idealmente non avrebbe dovuto confezionare i file che sono caricamento su S3 entro la cartella asset. Sono più che aperto a suggerimenti e miglioramenti.

E 'tutto nella documentazione: 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!

Sulla commento @joseph di Jaber questo ha funzionato a meraviglia per me:

Il codice sotto shoud essere in seeds.rb

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

Questo creerà 20 utenti e dare a ciascuno un'immagine avatar diversa.

Ho usato la gemma falsario per generare i dati, ma tutti Faker::Avatar.image non fa altro che restituire un URL standard, così da poter utilizzare qualsiasi URL di vostra scelta.

L'esempio precedente presuppone che l'attributo modelli utente in cui si memorizzano le immagini voi è chiamato avatar

Se l'attributo è stato chiamato immagine si può scrivere in questo modo:

remote_image_url: (Faker::Avatar.image)

La soluzione più semplice per me è stato:

  1. Commento-out della linea mount_uploader nel modello
  2. Seme i dati
  3. Rimuovere il commento dalla linea nel modello
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top