2014-07-05 1 views
5

Ho un modello con una colonna image. Sto usando CarrierWave per caricare le immagini (Sto seguendo questo rails cast per fare questo.Errore CarrierWave :: FormNotMultipart durante la creazione di record utilizzando il file seed.rb

Ora, voglio creare alcuni record predefiniti utilizzando seed.rb file, ma non sono riuscito a condizione corretta parh/url alle immagini.

Così, ho immagini nella voce nell'elenco delle cartelle app/public/images/ e questo è il codice dal file seed.rb:

gems = { 

    test1: { 

     name: 'test1', 
     description: 'test1', 
     image: '/public/images/test1.png', 
    }, 

    test2: { 

     name: 'test2', 
     description: 'test2', 
     image: '/public/images/test2.png' 
} 

gems.each do |user, data| 

    gem = DemoGem.new(data) 

    unless DemoGem.where(name: gem.name).exists? 
    gem.save! 
    end 
end 

e sto ottenendo il seguente errore quando ho eseguito rake db:seed comando:

CarrierWave :: FormNotMultipart: si è tentato di assegnare una stringa o un percorso a un utente di caricamento, per motivi di sicurezza, questo non è consentito.

Qualcuno potrebbe dire come previsto corretta url alle immagini?

+0

@Pavan No, non ho. Dovrei testarlo perché non sto usando il modulo - Sto inserendo record usando il codice:? – gotqn

+0

Prova a passare 'image' come file, usando' File.open (percorso, 'rb') 'se è un file locale – PerfectlyNormal

risposta

13

Presumendo che il modello Gem ha il campo image come uploader Carrierwave (vale a dire, hai mount_uploader :image, ImageUploader o simili nel modello Gem), è possibile assegnare un oggetto rubino File per l'attributo image, non una stringa. Qualcosa di simile a questo:

gem = Demogem.new(data) 
image_src = File.join(Rails.root, "/public/images/test2.png") 
src_file = File.new(image_src) 
gem.image = src_file 
gem.save 

Nel codice complesso, si potrebbe o modificare i dati di semi (così la vostra proprietà image nel vostro hash è stato impostato su File.new(File.join(Rails.root, "/public/images/test1.jpg")) o cambiare il modo in cui si costruisce i tuoi nuovi record in modo che doesn 't utilizzare il image per impostazione predefinita:.

gems.each do |user, data| 
    gem = DemoGem.new(data.reject { |k, v| k == "image" }) 
    gem.image = new File(File.join(Rails.root, data["image"])) 

    unless DemoGem.where(name: gem.name).exists? 
     gem.save! 
    end 
end 

il CarrierWave wiki has some documentation on this, ma non è molto ampia

0

Questo è quello che faccio sul mio caso:

["Sublime Text 3", "Internet Explorer"].each do |title| 
    unless Post.exists?(title: title) 
    post = Post.create!(title: title, 
         subtitle: "Subtitle of the #{title}", 
         content: "A sample post of the content about #{title}", 
         author: User.first) 
    post.attachments_attributes = [file: Rails.root.join("spec/fixtures/photo.jpg").open] 
    post.save! 
    end 
end