为什么.save调用模型验证属性没有更新?

时间:2014-12-13 11:38:03

标签: ruby ruby-on-rails-4

我有一个用户模型,我正在编写一种更新电子邮件身份验证令牌的方法。当我尝试使用用户对象调用该方法时,它会引发验证错误,提交的密码为空。用户对象已经保存并且已经找到并从控制器调用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属性时,为什么会提出密码验证?

错误如下: 的ActiveRecord :: RecordInvalid 验证失败:密码不能为空,密码确认不能为空

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

1 个答案:

答案 0 :(得分:0)

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

  

验证:密码,存在:true,on :: create