Ruby - ActiveModel :: SecurePassword не работает - PullRequest
0 голосов
/ 05 мая 2018

У меня есть простой класс ruby ​​с включенными ActiveModel::Validations и ActiveModel::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

Согласно документации здесь has_secure_password предоставляет проверки на password accessor:

  1. Пароль должен присутствовать.
  2. Пароль должен быть равен его подтверждению (при условии, что передано password_confirmation).
  3. Максимальная длина пароля - 72 (требуется bcrypt, от которого зависит ActiveModel :: SecurePassword)

Что я делаю не так? Как этот объект ложный?

EDIT Я также попытался добавить атрибут password_confirmation, но он тоже не работал.

user.password_confirmation = "password"

puts user.valid? => false

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

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Поскольку вам нужно заполнить password_digested на ActiveModel::SecurePassword, вы должны вызвать User#password= метод установки . Но этого не происходит, когда вы устанавливаете пароль с помощью @password = password в инициализаторе. Чтобы исправить это, вы установили его с помощью self.password = password:

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

Также вам необходимо удалить :password из attr_accessor вызова, потому что SecurePassword предоставляет его.

0 голосов
/ 05 мая 2018

Полагаю, вам также необходимо установить атрибут user.password_confirmation.

http://api.rubyonrails.org/classes/ActiveModel/SecurePassword/ClassMethods.html#method-i-has_secure_password

...