为什么 .save 调用属性的模型验证未更新



我有一个用户模型,我正在编写一个方法来更新电子邮件身份验证令牌。当我尝试使用用户对象调用该方法时,它会引发验证错误,即提交的密码为空。用户对象已保存,并且已从控制器找到并调用gen_token方法(例如:user.gen_token)。我的部分代码如下所示:

#controller
user.gen_token
#User model
validates :password, presence: true
def gen_token
  self[:email_token]=SecureRandom.urlsafe_base64
  save!
end

我的问题是,当我只更新用户模型的email_token属性时,为什么会引发密码验证?

错误如下:活动记录::记录无效验证失败:密码不能为空,密码确认不能为空

我还意识到,如果我删除 save!,代码可以正常工作,因为它会更新email_token。现在我想知道在模型中调用 save 或 update_attribute 是否有必要,因为您可以通过执行 self[attribute]=new_value 来更改属性。

.save 调用对象上的所有验证
如果要跳过验证,请使用update_column方法或update_attribute方法来更新 email_token.
您还可以在验证中添加条件,例如

验证:p assword,状态:真,打开:创建

最新更新