Ruby - ActiveModel :: SecurePassword无效

时间:2018-05-05 17:18:29

标签: ruby validation passwords activemodel

我有一个简单的ruby类,其中包含ActiveModel::ValidationsActiveModel::SecurePassword,我为新的obkject提供了所有必需的属性(下面)但是当我验证它时它会说{{1} }}

false

require 'active_model' require 'bcrypt' class User include ActiveModel::Validations include ActiveModel::SecurePassword attr_accessor :name, :email, :password, :password_digest def initialize(name:, email:, password:) @name, @email, @password = name, email, password end validates :name, :email, presence: true has_secure_password end user = User.new( name: "TestUser1", email: "test@gmail.com", password: "password" ) => puts user.valid?

false => puts user.errors.messages

{:password=>["can't be blank"]} => puts user.password

根据文档here password提供has_secure_password访问者的验证:

  1. 密码应该存在。
  2. 密码应等于其确认(如果传递了password_confirmation)。
  3. 密码的最大长度为72(由ActiveModel :: SecurePassword依赖的bcrypt所需)
  4. 我做错了什么?该对象如何错误?

    修改 我还尝试添加password属性,但它也没有。

    password_confirmation

    user.password_confirmation = "password" => puts user.valid?

    false => puts user.errors.messages

2 个答案:

答案 0 :(得分:2)

由于您需要password_digested填充ActiveModel::SecurePassword,因此您必须致电User#password= setter method。但是,如果您在初始化程序中使用@password = password设置密码,则不会发生这种情况。要解决此问题,您可以使用self.password = password

进行设置
def initialize(name:, email:, password:) 
  @name, @email = name, email
  self.password = password
end

此外,您需要从:password来电中移除attr_accessor,因为SecurePassword提供了此信息。

答案 1 :(得分:0)