2011-01-19 6 views
3

ユーザーのアバターを保存するためにクリップがうまく機能していますが、アップデートで問題が見つかりました。Rails 3とpaperclip on updateメソッドの問題

私の見解では、モデルに画像が保存されている場合は、現在の画像がファイルアップロードフィールドの横に表示され、現在のアバターが何であるかがわかります。

イメージに変更はないが、モデルの検証に失敗した場合(first_nameがないなど)、元の表示イメージが消えます。つまり、エラーを修正してイメージを再選択して送信(更新)またはgoエラーなしでやり直すことができます。何か案は?前もって感謝します。

相続コード:

モデル

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新しいアバターがアップロードされていないので空白になります)。隠された一時的なフィールドでは、いくつかの方法があります:

  • クライアント側の検証。間違っているとページが送信されないようにし、サーバー側の検証に失敗してイメージが失われることはありません。
  • アバターフィールドを、アバターのみを扱う同じページの別のFORMオブジェクトに移動します。これにより、実際のアバター編集に関連している場合にのみ、ページがアバター情報をPOSTメッセージで送信することが確実になります。
  • アバターのアップロード/アップデート機能を、アバターのみを扱う完全に別のページに移動します。これは、上記の理由が上記の理由と同じ理由で機能します。
+0

ありがとうございました!フォームオブジェクトと言うと、文字通り別のフォームやモデルを意味するのですか?同じフォーム内でfields_forを使用するようなものを意味しますか? (申し訳ありませんが、まだかなり新しいレールです!)返信いただきありがとうございます。 – Mike

+0

後者です。オプション2では、HTMLソースに2つのフォームタグを生成するような方法でビューを作成します。 fields_for、form_for、または他の方法を使用してビュー内で新しいフォームを開始すると機能します。 – Shaun

+0

お元気です、助けてくれてありがとう。 – Mike