我有一个简单的ruby类,其中包含ActiveModel::Validations
和ActiveModel::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
访问者的验证:
我做错了什么?该对象如何错误?
修改
我还尝试添加password
属性,但它也没有。
password_confirmation
user.password_confirmation = "password"
=> puts user.valid?
false
=> puts user.errors.messages
答案 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)
我相信你也需要设置user.password_confirmation属性。