【问题标题】:Ruby - ActiveModel::SecurePassword not workingRuby - ActiveModel::SecurePassword 不起作用
【发布时间】:2018-10-15 22:57:25
【问题描述】:

我有一个简单的 ruby​​ 类,其中包含 ActiveModel::ValidationsActiveModel::SecurePassword,我为新对象提供了所有必需的属性(如下),但是当我验证它时它说它是 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 => password

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

  1. 密码应该存在。
  2. 密码应与其确认相同(前提是password_confirmation 已传递)。
  3. 密码的最大长度为 72(ActiveModel::SecurePassword 所依赖的 bcrypt 要求)

我做错了什么?这个对象怎么是假的?

编辑 我也尝试添加password_confirmation 属性,但也没有用。

user.password_confirmation = "password"

puts user.valid? => false

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

【问题讨论】:

    标签: ruby validation passwords activemodel


    【解决方案1】:

    由于您需要用ActiveModel::SecurePassword 填充password_digested,因此您必须致电User#password= setter method。但是,当您在初始化程序中使用 @password = password 设置密码时,它不会发生。要修复它,您已使用 self.password = password 设置它:

    def initialize(name:, email:, password:) 
      @name, @email = name, email
      self.password = password
    end
    

    您还需要从attr_accessor 调用中删除:password,因为SecurePassword 提供了它。

    【讨论】:

    • 它有效。请问你,你怎么知道我需要做self.password = password。文档中没有任何地方这么说,我永远也弄不明白。
    • 基本上当我在文档中看到当你分配password 字段时,你会得到password_digest 字段自动填充加密密码,我发现应该在某处覆盖password= 方法。文档并没有真正提到这一点,因为它与 ActiveRecord 一起开箱即用。
    • 好的,但这并不能解释为什么需要self.password = passwordpassword= setter 方法设置在 attr_accessor :password 中。我阅读了文档和示例,发现 password 属性是由 has_secure_password 类方法自动添加到实例中的,所以我从代码中删除了该属性,它也可以正常工作。
    【解决方案2】:

    【讨论】:

    • 根据我链接的文档我不需要,但是我已经尝试过了,但它不起作用 user.password_confirmation = "password" user.valid? => 错误
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    相关资源
    最近更新 更多