2011-01-10 5 views
14

Sto provando a utilizzare l'attributo multiplo HTML5 su un campo file in una forma nidificata.In che modo il campo di caricamento di più file HTML5 si associa a un modello annidato in Rails 3?

I modelli sono i seguenti:

class Album < ActiveRecord::Base 

    has_many :album_images 
    has_many :images, :through => :album_images 

    accepts_nested_attributes_for :images 

end 

class Image < ActiveRecord::Base 

    has_many :album_images 
    has_many :albums, :through => :album_images 

    mount_uploader :filename, ImageUploader 

    validates_presence_of :filename 

end 

La vista:

<%= semantic_form_for @album, :url => upload_path do |f| %> 
    <%= f.inputs do %> 
     <%= f.input :name, :label => 'Album title' %> 
    <% end %> 

    <%= f.input :images, :as => :file, :input_html => {:multiple => true} %> 

    <%= f.buttons do %> 
     <%= f.commit_button 'Upload' %> 
    <% end %> 
    <% end %> 

Quando uso per il campo di file:

<%= f.input :images, :as => :file, :input_html => {:multiple => true} %> 

ottengo:

<input id="album_images" multiple="multiple" name="album[images][]" type="file"> 

Quale non sembra corretto dal Penso che Voglio impostare direttamente il nome del file sull'oggetto, ma non ne sono sicuro. Quando provo a caricare con questo campo, i params in arrivo assomigliano:

"album"=>{"name"=>"2011-01-09", "images"=>["IMG_0052.JPG", "IMG_0053.JPG", "IMG_0054.JPG", "IMG_0055.JPG"]} 

Tuttavia, ottengo il seguente errore:

ActiveRecord::AssociationTypeMismatch (Image(#2157004660) expected, got String(#2151988680)): 

OK, che l'errore è probabilmente dovuto al fatto che solo ha ricevuto un nome file e non un oggetto immagine. Così, invece, che uso per il campo di file:

<%= f.input :images, :as => :file, :input_html => {:multiple => true, :name => 'album[images][][filename]'} %> 

per i quali Formtastic genera:

<input id="album_images" multiple="multiple" name="album[images][][filename]" type="file"> 

I params in arrivo assomigliano:

"album"=>{"name"=>"2011-01-09", "images"=>[{"filename"=>"IMG_0052.JPG"}, {"filename"=>"IMG_0053.JPG"}, {"filename"=>"IMG_0055.JPG"}]} 

Ma poi ho ottenere questo errore:

Image(#2153868680) expected, got ActiveSupport::HashWithIndifferentAccess(#2158892780) 

Così come doe s uno su come impostare questa mappatura di file input multipli in Rails?

Grazie.

+1

Downvoted perché non hai mai fornito alcun feedback alla risposta qui sotto e non è mai tornato ad aggiornare la tua domanda se avessi/non avessi risolto. –

risposta

2

è necessario includere :html => { :multipart => true } nella chiamata form_for (o nel tuo caso semantic_form_for) in modo che il tag <form> è impostato per supportare il caricamento di file.

Quindi ripristinare la sintassi originale per f.input e si dovrebbe essere proprio allora.