2013-04-05 4 views
0

내 응용 프로그램은 내 양식의 입력 필드에서 선택한 각 이미지에 대한 이미지 개체를 생성합니다. 생성 액션은 :picture 매개 변수를 반복하며 각 항목에 대해 새 이미지 객체를 생성합니다. 그러나 입력 상자에서 선택한 마지막 이미지에 대해서만 이미지 객체를 만드는 것으로 보입니다. 왜 이것이 제대로 작동하지 않습니까?마지막 매개 변수 만 개체로 전달됩니다.

컨트롤러

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 

보기 양식

<%= 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%> 

요청에 Params는에 제출

{"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"} 

내가 GRE 것 atly는 당신이 공유 할 수있는 어떤 도움을 주셔서 감사합니다!

답변

1

@album.images.build은 개체 만 만들 것이고 데이터베이스에 저장하지 않습니다. each 루프를 종료하면 @image은 마지막으로 만들어진 이미지 (매개 변수의 마지막 이미지)입니다.

사용 @album.images.create을 사용하면 실제로 이미지가 데이터베이스에 저장되므로 원하는대로 유지됩니다. 그러나 each 블록 이후의 논리는 더 이상 유효하지 않습니다. 마지막 이미지가 저장되었다는 것을 확인하기 때문입니다. 각 이미지가 각 블록 안에 저장되어 있는지 확인하고, 원하는 이미지라면 어떤 이미지가 실패했는지 기록해야합니다.

+0

내 뇌가 폭발했습니다. 정말 고맙습니다. (나는 9 분 안에 대답 할 것이다. : p) –

+0

btw ... 각자 저장했는지 아닌지 기록 할 것을 제안 했는가? –

관련 문제