2011-01-19 8 views
3

사용자 아바타를 저장하는 데는 클립이 잘 작동하지만 업데이트시 문제가 있습니다.레일 3 및 업데이트 방법 클립 문제

내보기에 사용자가 모델에 저장된 이미지가있는 경우 파일 업로드 필드 옆에 현재 이미지가있는 이미지 태그가 표시되므로 현재 아바타의 모습을 볼 수 있습니다.

이미지에 아무런 변화가 없지만 모델 유효성 검사가 실패하면 (예 : first_name 없음) 원래의 표시 이미지가 사라집니다. 즉, 사용자가 오류를 수정하고 이미지를 다시 선택하고 제출 (업데이트)하거나 이동해야합니다 오류없이 다시 시작하십시오. 어떤 아이디어? 미리 감사드립니다.

을 Heres 코드 :

모델

class User < ActiveRecord::Base 

    # Validation 
    validates :first_name, :presence => true 

    # Paperclip 
    has_attached_file :avatar, :styles => { :medium => "300x300>", :thumb => "70x70#" } 

end 

컨트롤러

... 
    # GET /users/1/edit 
    def edit 
    @user = User.find(params[:id]) 
    end 

    # POST /users 
    # POST /users.xml 
    def create 
    @user = User.new(params[:user]) 

    respond_to do |format| 
     if @user.save 
     format.html { redirect_to(@user, :notice => 'User was successfully created.') } 
     format.xml { render :xml => @user, :status => :created, :location => @user } 
     else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @user.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

    # PUT /users/1 
    # PUT /users/1.xml 
    def update 
    @user = User.find(params[:id]) 

    respond_to do |format| 
     if @user.update_attributes(params[:user]) 
     format.html { redirect_to(@user, :notice => 'User was successfully updated.') } 
     format.xml { head :ok } 
     else 
     format.html { render :action => "edit" } 
     format.xml { render :xml => @user.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 
... 

보기

<%= form_for @user, :html => {:multipart => true} do |f| %> 
    <div class="row text"> 
    <%= f.label :first_name %> 
    <div class="field"> 
     <%= f.text_field :first_name %> 
    </div> 
    </div> 
    <div class="row"> 
    <%= f.label :avatar %> 
    <div class="field"> 
     <%= image_tag @user.avatar.url(:thumb) %> 
    </div> 
    <div class="field" id="avatar_upload"> 
     <%= f.file_field :avatar %> 
    </div> 
    </div> 
    <div class="row actions"><%= f.submit %> or <%= link_to 'cancel', users_path %>.</div> 
<% end %> 

답변

3

이 서버에 '전무'를 보내는 양식에 의해 발생되고있다 (f 페이지가 서버에 POST 요청을 보낼 때 새 아바타가 업로드되지 않으므로 공백이됩니다.) 숨겨진 임시 필드가있는 부분을 제외하면 다음과 같은 몇 가지 방법이 있습니다.

  • 클라이언트 측 유효성 검사. 잘못된 것이 있으면 제출하지 말고 누락 된 이미지를 초래하는 서버 측 유효성 검증 실패에 도달하지 않도록하십시오.
  • 아바타 필드 만 아바타를 처리하는 동일한 페이지에서 별도의 FORM 개체로 이동하십시오. 그러면 실제 아바타 편집과 관련된 경우에만 페이지가 아바타 정보를 POST 메시지로 전송합니다.
  • 아바타 업로드/업데이트 기능을 아바타 만 처리하는 완전히 다른 페이지로 이동하십시오. 이것은 위의 이유가 작동하는 것과 같은 이유로 작동합니다.
+0

감사! 양식 객체를 말할 때 말 그대로 별도의 양식 또는 모델을 의미합니까? 아니면 동일한 양식 내에서 fields_for를 사용하는 것과 같은 것을 의미합니까? (죄송합니다, 레일에 아직 아주 새로운!) 답변 주셔서 감사합니다. – Mike

+0

후자입니다. 옵션 2는 HTML 소스에 두 개의 양식 태그를 생성하는 방식으로보기를 작성한다는 의미입니다. fields_for, form_for 또는 다른 방법을 사용하여보기에서 새 양식을 시작할 수 있습니다. – Shaun

+0

숀 Shaun, 도와 줘서 고마워. – Mike