关于更新方法问题的Rails 3和回形针

时间:2011-01-19 00:09:21

标签: ruby-on-rails ruby-on-rails-3 paperclip

Paperclip可以很好地保存用户头像,但我发现更新时存在问题。

在我看来,如果用户在模型中保存了图像,则会在文件上传字段旁边显示当前图像的图像标记,以便您可以看到当前头像的位置。

如果图像没有变化但模型验证失败(如没有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 %>

1 个答案:

答案 0 :(得分:3)

这是由于当您的页面向您的服务器发送POST请求时,您的表单向服务器发送'nil'(由于该字段为空,因为没有上传新的头像)。如果没有隐藏的临时字段,可以通过以下几种方式解决问题:

  • 客户端验证。如果出现任何问题,请阻止您的网页提交,并且最终无法达到导致图像丢失的服务器端验证失败。
  • 将头像字段移动到仅处理头像的同一页面上的单独FORM对象。这将确保页面仅在POST消息中发送头像信息(如果它与实际头像编辑相关)。
  • 将头像上传/更新功能移至仅处理头像的完全独立的页面。这与上述原因相同的原因相同。