2013-01-09 5 views
8

Ho un modello Artwork con un attributo immagine in cui Carrierwave è montato. Mentre scrivevo le specifiche del controller, mi sono reso conto che il campo dell'immagine rimaneva vuoto, anche quando pensavo di passare in un oggetto file.Quali parametri devo passare nel controller per un modello montato su Carrierwave?

Le mie informazioni di debug mi dicono che il problema riguarda l'attributo dell'immagine su cui CarrierWave è montato e non qualcos'altro. Non penso di passare le informazioni di cui ha bisogno, ma non so cosa provare.

Ecco il l'azione di controllo, con alcune informazioni di debug per identificare il problema:

def create 
    @artwork = @imageable.artworks.new(params[:artwork]) 
    logger.debug "Artwork should be valid: #{@artwork.valid?}" 
    logger.debug "Errors: #{@artwork.errors.full_messages}" 
    if @artwork.save 
     flash[:success] = "Artwork created." 
     redirect_to [@imageable, :artworks] 
    else 
     flash[:error] = "Artwork not created." 
     render :new 
    end 
end 

nel log di test vedo questo dopo aver eseguito le mie specifiche:

Processing by ArtworksController#create as HTML 
    Parameters: {"artwork"=>{"image"=>"#<File:0x4515480>", "title"=>"Portrait","year"=>"2012", "surface_type"=>"canvas", "size"=>"10 x 10", "price"=>"100.0", "for_sale"=>false, "prints_available"=>false, "notes"=>"extra notes"}, "file"=>"#<File:0x46c6938>", "originals_gallery_id"=>"1"} 
[1m[36mOriginalsGallery Load (0.0ms)[0m [1mSELECT "originals_galleries".* FROM "originals_galleries" WHERE "originals_galleries"."id" = ? LIMIT 1[0m [["id", "1"]] 
Artwork should be valid: false 
Errors: ["Image can't be blank"] 

Ogni pensiero, per favore? C'è un controller che mi dimentico di impostare?

risposta

17

Il mio problema era più generale: durante i miei test (con Rspec e FactoryGirl) stavo passando il tipo di oggetto file errato all'azione del controller. Questo è il tipo di oggetto che stava definendo per il mio attributo immagine:

FactoryGirl.define do 
    factory :artwork do 
    image { File.open(File.join(Rails.root, 'spec', 'support', 'sample.gif')) } 
    ...other attributes omitted 
    end 
end 

The above is the setup that Carrierwave docs recommended for FactoryGirl test fixtures. Ha funzionato per testare il modello e la maggior parte delle azioni di controllo, ma non per l'azione creare.

I miei registri di test mi dicevano che il mio attributo di immagine era vuoto, nonostante il passaggio in questo oggetto File. Dopo alcune ricerche ho scoperto che è possibile passare in un'istanza di Rack :: Test :: UploadedFile (penso che ActionDispatch :: Http :: UploadedFile sia ciò che viene inviato tramite il browser (?)).

Quindi anziché l'attributo image impostato su File.open(...) in fabbrica, l'ho impostato su Rack::Test::UploadedFile.new(Rails.root.join("spec/support/sample.gif")). Le specifiche del mio controller sono passate e il caricamento del file è stato salvato nel database.

Penso che questo aiuti a spiegare perché molte persone assistano al caricamento di file di successo nel browser, ma non nei loro test o convalide.

This post about testing file attachments in Rails 3 really helped.

+0

Era bloccato cercando di risolvere lo stesso problema. Grazie mille! – wyclin