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



我知道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保留为空白,控制器代码将愉快地通知用户"成功更新密码"。

但是用户没有更新。没有将密码设置为空值。处理步骤

我试过在密码验证上设置条件,但我的尝试似乎都不起作用。我要做的是每次在表单中提交密码字段时验证密码的存在和长度(即使它是空白的)。我在谷歌上搜索了一下,我读过的例子都没用。

必须有一个不破坏事物的标准解决方案。期望的功能是每次在表单中提交密码字段时,应该运行密码验证并验证密码不是空白的,满足最小长度要求等…

我见过很多人说这些方法有效,但似乎没有一个真的有效:

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

我遇到过同样的问题,所以这就是解决我的问题的方法我把这个字符添加到我的模型

validates :password , presence: true 

最新更新