我的用户模型中有这段代码:
class User < ActiveRecord::Base
attr_accessible :email, :password, :password_confirmation
attr_accessor :password
before_save :encrypt_password
validates :email, :presence => true,
:uniqueness => { :case_sensitive => false },
:format => { :with => /\A[^@]+@[^@]+\z/ },
:length => 7..128
validates :password, :presence => true,
:confirmation => true,
:length => 6..128
private
def encrypt_password
return unless password
self.encrypted_password = BCrypt::Password.create(password)
end
end
现在在我的控制器中,当我更新一些用户字段时
@user.update_attributes(params[:user])
始终验证密码字段,即使未在 params 哈希中设置它也是如此。我认为这是因为 attr_accesor :password 总是在 update_attributes 上设置 password = ""。
现在我可以简单地跳过密码验证,如果它是一个空字符串:
validates :password, :presence => true,
:confirmation => true,
:length => 6..128,
:if => "password.present?"
但这不起作用,因为它允许用户设置空密码。
在我想更改的字段上使用 update_attribute 不是解决方案,因为我需要对该属性进行验证。如果我传入确切的参数
@user.update_attributes(params[:user][:fieldname])
它不能解决问题,因为它还会触发密码验证。
没有办法阻止 attr_accesor :password 在更新时始终设置 password = "" 吗?