Hello stackoverflow成员。
我一直关注此guide以使用户拥有自己的头像。
但是我遇到了一个小问题。 当用户裁剪图像时,模型会尝试验证我的所有验证。 我的用户模型如下所示:
class User < ActiveRecord::Base
has_attached_file :avatar, :styles => { :small => "100x100>", :large => "500x500>" }, :processors => [:cropper]
attr_accessor :password, :crop_x, :crop_y, :crop_w, :crop_h
attr_accessible :crop_x, :crop_y, :crop_w, :crop_h
validates_confirmation_of :password
validates_presence_of :password
当用户运行裁剪更新脚本时,user
模型会尝试验证密码。但是因为我在裁剪页面上没有密码字段,所以无法对其进行验证。
以下是作物的更新:
@user = User.find(current_user.id)
if @user.update_attributes(params[:user])
flash[:notice] = "Successfully updated user."
end
如何以简单明了的方式绕过这个?
答案 0 :(得分:0)
尝试条件验证:
validates_confirmation_of :password, :if => :password
validates_presence_of :password, :if => :password
答案 1 :(得分:0)
根据authlogic使用的技术,尝试仅在新记录,密码更改或密码密码(存储哈希/加密密码的列)为空白时验证密码。< / p>
class User
validates_confirmation_of :password, :if => :require_password?
validates_presence_of :password, :if => :require_password?
def password=(pass)
return if pass.blank?
# Encrypt password, etc
# ...
@password_changed = true
end
private
def require_password?
new_record? || @password_changed || crypted_password.blank?
end
end
答案 2 :(得分:0)
@htanata的类似答案,但使用ActiveRecord:Dirty:
class User
validates_confirmation_of :password, :if => 'self.password_changed?'
validates_presence_of :password, :if => 'self.password_changed?'
end
答案 3 :(得分:0)
调用#save
并传递false
以禁用该数据库更新的验证。
将您的控制器代码更改为:
@user = User.find(current_user.id)
@user.attributes = params[:user]
if @user.save(false)
flash[:notice] = "Successfully updated user."
end
如果您依靠Paperclip进行图像验证,这会导致问题。它可能会掩盖格式错误的图像文件的一些问题,但它可能值得权衡。