2011-01-19 35 views
3

回形针运行良好,以保存用户头像,但我发现更新的问题。Rails 3和回形针更新方法问题

在我看来,如果用户在模型中保存了一个图像,它将在文件上传字段旁边显示带有当前图像的图像标签,以便您可以看到您当前的头像是什么。

如果图像没有变化,但模型验证失败(如no first_name),原始显示图像消失,这意味着用户必须纠正错误并重新选择图像并提交(更新)或去返回并重新开始,而不会出现错误。有任何想法吗?提前致谢。

继承人的代码:

型号

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 2011-01-19 08:01:02