gpt4 book ai didi

validation - Rails 4 'has_secure_password' 验证空白密码,无法执行条件验证

转载 作者:行者123 更新时间:2023-12-04 16:10:03 24 4
gpt4 key购买 nike

我知道 has_secure_password 在 :create 操作上添加了对 password 和 password_confirmation 的验证。

创建新用户时,必须输入密码(并确认),否则用户无效。这是预期的行为,这很好。

当您想要更新用户时,您可以更新选择属性而无需提交密码/确认。这也很好,因为我可以更新用户名而无需密码。

但是,我遇到了一种情况,我想更新用户的密码,我要求用户输入他们当前的密码,然后输入他们的新密码并进行确认。问题是当我只输入当前密码并提交表单时,它通过了所有验证。尽管这可能是预期的行为,但我认为这是一种非常糟糕的行为,因为即使密码通过了所有验证,它也不会更改为空白值。如果我只是假设代码实际上做了它“说”的事情,那么用户现在应该有一个空白密码。

class User < ActiveRecord::Base
# model has password_digest field
has_secure_password

# has_secure_password automatically adds the following...
# validates :password, presence: true, on: [:create]

validates :password, length: { minimum: 8 }
end

class SettingsController < ApplicationController
# POSTed from form with fields :current_password, :new_password, :new_password_confirmation
def update_password
if current_user.authenticate(params[:current_password])
if current_user.update_attributes(password: params[:new_password], password_confirmation: params[:new_password_confirmation])
flash.now[:notice] = "Successfully updated Password"
else
# Problem with new password (do nothing)
flash.now[:error] = "Invalid new password or confirmation (nothing changed)"
render "error"
end
else
flash.now[:error] = "Must provide current password to change your password"
render "error"
end
end
end

如果您正确输入了 current_password 但将 new_password 和 new_password_confirmation 留空, Controller 代码会高兴地通知用户“密码更新成功”。

但是用户没有更新。密码未设置为空白值。它没有改变。

我试图对密码验证设置条件,但我的尝试似乎都没有奏效。我想要做的是每次在表单中提交密码字段时验证密码的存在和长度(即使它是空白的)。我已经用谷歌搜索了这个,但我读过的例子都没有工作。

必须有一个标准的解决方案,不会破坏东西。所需的功能是每次在表单中提交密码字段时,密码验证应该运行并验证密码不为空,满足最小长度要求等...

我见过很多人说这些工作,但这些似乎都没有真正工作:
validates :password, length: ( minimum: 8 }, if: -> { password.present? }
validates :password, length: ( minimum: 8 }, allow_nil: true

最佳答案

当且仅当密码和 password_confirmation 为空时,有一个验证允许密码为空。因此,如果您尝试更新密码并且不发送密码确认,则会引发错误。

尝试这个:

validates :password, length: { minimum: 8 }, allow_blank: true

关于validation - Rails 4 'has_secure_password' 验证空白密码,无法执行条件验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22336657/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com