在我的用户模型中,我有一个hash_password方法,可以在创建新用户之前加密用户的密码。我还在更新用户密码时使用此方法。这导致密码被哈希两次。
user.rb:
before_create :hash_password
before_update :hash_password
def hash_password
self.password = Digest::SHA1.hexdigest(self.password)
self.password_confirmation = Digest::SHA1.hexdigest(self.password_confirmation)
end
如何防止这种情况发生?提前感谢您的帮助。
答案 0 :(得分:2)
我认为问题在于,当您输入新密码时,您会在保存时进行哈希处理,但是当密码未更改时,您也会在保存时进行哈希处理(以及双重哈希)
您可能想要尝试此操作,在before_save
def hash_password
return if persisted? && password == User.find(id).password
self.password = Digest::SHA1.hexdigest(password)
self.password_confirmation = Digest::SHA1.hexdigest(password_confirmation)
end
这意味着散列只会发生在新记录或密码更改的持久记录上。
答案 1 :(得分:0)
回调before_create
和before_update
可以与before_save
合并/替换。也就是说,如果你想要那个功能。如果您只想在创建函数时调用该函数,那么当然要取出before_update
回调。
更新
这可能是您如何创建User
的一些怪癖。如果您拨打User.create
,它似乎会触发两次,但如果您使用User.build
然后使用save
,它似乎可以正常工作,至少根据this article。
答案 2 :(得分:0)
替换
before_create :hash_password
before_update :hash_password
使用before_save :hash_password