ruby-on-rails - 关于更新方法问题的 Rails 3 和回形针

标签 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

Controller

...
  # 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 %>

最佳答案

这是由于当您的页面向您的服务器发送 POST 请求时,您的表单向服务器发送“nil”(由于该字段为空白,因为没有上传新头像)导致的。除了用隐藏的临时字段搞砸之外,有几种方法可以解决这个问题:

  • 客户端验证。如果有任何错误,请阻止您的页面提交,这样您就不会最终遇到导致图像丢失的服务器端验证失败。
  • 将头像字段移至同一页面上仅处理头像的单独 FORM 对象。这将确保该页面仅在 POST 消息中发送与实际头像编辑相关的头像信息。
  • 将头像上传/更新功能移至一个完全独立的页面,该页面仅处理头像。这与上述原因相同。

关于ruby-on-rails - 关于更新方法问题的 Rails 3 和回形针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4730478/

相关文章:

mysql - 如何创建与 Rails 中的 View 相对应的模型

ruby-on-rails - 用户回形针重命名上传的文件

ruby-on-rails - 在 Rails 4 中的视频文件上使用 Paperclip ——强参数问题?

ruby-on-rails - 如何在不担心主键的情况下更新记录

JavaScript 无法在 Rails 中运行

ruby-on-rails - 你知道任何 Rails "Announcements"插件吗?

ruby-on-rails - rails 3 : Make sure the user uses https

ruby-on-rails-3 - 无法从辅助模块访问 image_tag

ruby-on-rails - ActiveAdmin 与 PaperClip

ruby-on-rails - 从 HTML 页面中删除所有 JavaScript