2010-10-11 49 views
29

Sto provando a seminare un database in Rails 3 con le immagini usando CarrierWave, tuttavia niente di ciò che provo sembra funzionare a meno di doverli caricare tutti a mano.Semina i caricamenti di file con CarrierWave, Rails 3

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 seminare utilizzando CarrierWave?

+0

Scusate se sono lontano dal marchio, ma è "pi" una parola riservata? – danjah

+0

No, pi in ruby ​​è rappresentato come costante, che distingue tra maiuscole e minuscole come "PI". Tuttavia, il pensiero interessante. ;] –

+0

Questo è 'Math :: PI' a proposito. ;] –

risposta

38

La documentazione di CarrierWave è leggermente errata. C'è un pezzo più aggiornato del codice in the README at the GitHub repository for the project.

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! 
+10

È anche possibile farlo in una singola riga, se lo si desidera: 'ProductImage.create! (: Product => product, image: File.open (File.join (Rails.root, 'test.jpg'))) ' – Marcus

+1

È anche possibile eseguire l'intera azione in una riga' product.product_images.create! (Image: File.open (File.join (Rails.root, 'test.jpg '))) ' – Ninz

2

Ecco uno script di esempio 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.

Tutte le risorse che sto prelevando sono archiviate nell'app/assets/images e hanno nomi corrispondenti ai nomi dei miei oggetti Info (dopo aver sostituito gli spazi con caratteri di sottolineatura e scartare i nomi).

Sì, suona inefficiente, ma a parte mettere quelle risorse su una somehwhere FTP, è 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 modello My Info ha un'associazione has_one in un modello di Gallery, che ha un'associazione has_many in un modello di Foto. L'uploader Carrierwave è montato sulla colonna 'file' (stringa) 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 che sto inviando a S3 all'interno della cartella asset. Sono più che aperto ai suggerimenti & miglioramenti.

8

Fintanto che l'uploader è montato sul modello, utilizzando il metodo mount_uploader, è possibile eseguire il seeding dei modelli con carrierwave utilizzando il metodo aperto pertinente. Questo sarebbe un modo più conciso per ottenere 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']) 
}, 
{... 
+6

Invece di usare' open', 'remote_ [nome attributo] _url'può essere fornito. –

-1

La soluzione più semplice per me è stato:

  1. Commento-out della linea mount_uploader nel modello
  2. Seed i dati
  3. Decommenta la linea nel modello
Problemi correlati