Cargar varios archivos a la vez en la aplicación Rails con Carrierwave (HTML5)

Estoy cerca … muy cerca … Puedo cargar archivos individuales muy bien … pero cuando cambio el tipo de campo de file_field de mi formulario a :multiple => true así puedo cargar varias imágenes a la vez los archivos cargados se envuelven en una matriz … y la ‘magia’ de ‘accept_nested_attributes_for` se pierde.

Edición: Después de un examen más extenso, me pregunto si incluso necesito molestarme con accepts_nested_attributes_for ? Tal vez debería tener un file_field, :multiple => true en mi formulario de Galería (a diferencia de un formulario nested) y luego en mi acción de creación crear la nueva galería y luego recorrer cada elemento en los params[:gallery][:photos_attributes]["0"][:image] array a mano, por así decirlo, llamando a @gallery.photos.create para cada elemento. ??? Parece engorroso … pero es todo lo que puedo hacer.

Esperando que alguien con más experiencia con Rails pueda hacer …

Parámetros:

 {"utf8"=>"✓", "authenticity_token"=>"9jXvIwcllct7UyUfo6cvhEucQf2u3SY50SuaCLtFO4c=", "gallery"=>{ "name"=>"First Gallery", "photos_attributes"=>{"0"=>{ "image"=>[ #<ActionDispatch::Http::UploadedFile:0x00000104b78978 @original_filename="first_test_image.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"gallery[photos_attributes][0][image][]\"; filename=\"first_test_image.jpg\"\r\nContent-Type: image/jpeg\r\n", @tempfile=#>, #<ActionDispatch::Http::UploadedFile:0x00000104b78950 @original_filename="second_test_image.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"gallery[photos_attributes][0][image][]\"; filename=\"second_test_image.jpg\"\r\nContent-Type: image/jpeg\r\n", @tempfile=#> ] } } }, "commit"=>"Save", "action"=>"create", "controller"=>"galleries"} #app/models/gallery.rb class Gallery  :destroy accepts_nested_attributes_for :photos end #app/models/photo.rb class Photo  [:create, :destroy] end 

Galeriascontrolador

  def new @gallery = Gallery.new @gallery.photos.build respond_to do |format| format.html # new.html.erb format.json { render json: @gallery } end end ... def create @gallery = Gallery.new(params[:gallery]) respond_to do |format| if @gallery.save format.html { redirect_to @gallery, notice: 'Gallery was successfully created.' } format.json { render json: @gallery, status: :created, location: @gallery } else format.html { render action: "new" } format.json { render json: @gallery.errors, status: :unprocessable_entity } end end end 

Puedes hacer un pequeño truco para la matriz params, algo como:

 aux = [] params[:gallery][:photos_attributes][:image].each do |f| aux << {:image => f} end params[:post][:photos_attributes] = aux @gallery = Gallery.new(params[:gallery]) 

Tengo un problema similar, sé que es un truco feo, pero funciona para mí.

Deshágase de aceptar_nombre_atributos_para y, en su lugar, agréguelo a su modelo de Gallery.

 def photos=(attrs) attrs.each { |attr| self.photos.build(:image => attr) } end 

Además, asegúrese de que las fotos estén en los atributos accesibles de su galería en caso de que esté protegiendo contra la asignación masiva. De lo contrario, no obtendrás la asignación de hash de la matriz de fotos de tus parámetros. Es decir

 attr_accessible :field1, field2, :photos