Domanda

My app is supposed to create an image object for each image selected in the input field of my form. It–the create action– iterates over the :picture param and for each entry, it is supposed to create a new image object. However, it seems to only create an image object for the last image selected in the input box. Why is this not functioning properly?

Controller

class Admin::ImagesController < ApplicationController
    respond_to :html, :json
    #before_filter :split_hash, :only => [ :create, :update ]
    def index
        @album = Album.find(params[:album_id])
        @images = @album.images.all
    end
    def new
        @album = Album.find(params[:album_id])
        @image = @album.images.new
    end
    def create
        params[:image][:picture].each do |image|
            @album = Album.find(params[:album_id])
            @params = {}
            @params['picture'] = image
            @image = @album.images.build(@params)
       end
        if @image.save
            flash[:notice] = "Successfully added image!"
            redirect_to [:admin, @album, :images]
        else
            render "new"
            flash[:notice] = "Did not successfully add image :("
        end
    end
    def show
        @album = Album.find(params[:album_id])
        @image = @album.images.find(params[:id])
    end
    def edit
        @album = Album.find(params[:album_id])
        @image = @album.images.find(params[:id])
    end
    def update
        @album = Album.find(params[:album_id])
        @image = @album.images.find(params[:id])
        if @image.update_attributes(params[:image])
            flash[:notice] = "Successfully updated Image"
            redirect_to [:admin, @album, :images]
        else
            render "edit"
        end
    end
    def destroy
        @album = Album.find(params[:album_id])
        @image = @album.images.find(params[:id])
        @image.destroy
        @albumid = @album.id
        @id = @image.id
        FileUtils.remove_dir("#{Rails.root}/public/uploads/image/picture/#{@albumid}/#{@id}", :force => true)
        redirect_to admin_album_images_path(@album)
    end
  #     def split_hash
  #         @album = Album.find(params[:album_id])
        # @image = @album.images
  #     array_of_pictures = params[:image][:picture]
  #     array_of_pictures.each do |pic|
  #         size = array_of_pictures.size.to_i
  #         size.times {@image.build(params[:image], :picture => pic)}
  #         @image.save
        # end
  #     end
end

View Form

<%= form_for([:admin, :album, @image], :html => {:multipart => true}) do |f| %>
        <%= f.hidden_field :album_id, :value => @album.id %>
        <%= f.file_field :picture, :multiple => true %>
        <%= f.submit "Submit" %>
<%end%>

Request Params on Submit

{"image"=>{"picture"=>[#<ActionDispatch::Http::UploadedFile:0x10c986d88 @tempfile=#<File:/var/folders/bx/6z1z5yks56j40v15n43tjh1c0000gn/T/RackMultipart20130404-53101-3c2whv-0>,
 @headers="Content-Disposition: form-data; name=\"image[picture][]\"; filename=\"background-pic.jpg\"\r\nContent-Type: image/jpeg\r\n",
 @content_type="image/jpeg",
 @original_filename="background-pic.jpg">,
 #<ActionDispatch::Http::UploadedFile:0x10c986d60 @tempfile=#<File:/var/folders/bx/6z1z5yks56j40v15n43tjh1c0000gn/T/RackMultipart20130404-53101-bvdysw-0>,
 @headers="Content-Disposition: form-data; name=\"image[picture][]\"; filename=\"bible-banner.png\"\r\nContent-Type: image/png\r\n",
 @content_type="image/png",
 @original_filename="bible-banner.png">],
 "album_id"=>"10"},
 "authenticity_token"=>"dr8GMCZOQo4dQKgkM4On2uMs8iORQ68vokjW0e4VvLY=",
 "commit"=>"Submit",
 "utf8"=>"✓",
 "album_id"=>"10"}

I would greatly appreciate any help you can share!

È stato utile?

Soluzione

@album.images.build will only create the object, it will not save it to the database. When you exit your each loop, @image is just the last image that was built (which would be the last image in the params).

Using @album.images.create will actually save the image to database so that it is persisted like you expect; however, your logic after the each block won't be valid anymore, since you'll only be verifying that the last image was saved. You should check if each image is saved inside of the each block, and somehow record which ones were unsuccessful if that is what you want to do.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top