【发布时间】:2019-08-13 13:31:43
【问题描述】:
我为我的User 模型添加了密码密码验证:
validates :password, presence: true
validates :password, confirmation: { case_sensitive: true }
但是当我想更新users 上的其他字段时,这些验证导致交易无效,因为password 不存在。
通过一些研究,我意识到如果password 不存在,我可以跳过这些验证:
validates :password, presence: true, if: :validate_password?
validates :password, confirmation: { case_sensitive: true }, if: :validate_password?
def validate_password?
password.present? || password_confirmation.present?
end
但是,现在当我提交空白密码和密码确认时,validate_password? 返回false。我真的不明白发生了什么,因为
@user.update_attributes(password_reset_edit_params) 返回true
在哪里
password_reset_edit_params 是<ActionController::Parameters {"password"=>"", "password_confirmation"=>""} permitted: true>
但在里面
def validate_password?
password.present? || password_confirmation.present?
end
password 和 password_confirmation 评估为 nil,而我的 @user 密码不会更新为空字符串。
我应该提到我正在使用 Bcrypt,@user.password 实际上总是会评估为nil,而password_digest 是可用的。
那么解决方法是什么?最终我想我的问题很简单:
当我不尝试提交密码时如何忽略密码验证,但在提交空字符串时也允许这些验证?
我突然想到,我可以在控制器中添加一个不允许传递空字符串的条件,但必须有一个巧妙的方法来解决这个问题。
非常感谢任何帮助。谢谢!
【问题讨论】:
-
从您的验证中删除
, if: :validate_password?。 -
但这让我回到了我的第一个问题,其中每当我尝试更新
User的实例(有或没有password)时,都会触发验证,如果我尝试在不包含密码的情况下更新用户,验证会返回错误。
标签: ruby-on-rails ruby validation activerecord bcrypt