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/