根据标题,当我尝试在我的用户对象上调用以下代码段时:
user = User.find_by(Username: username).try(:authenticate, password)
我收到错误:
NameError (undefined local variable or method 'password_digest' for #...)
我采取的步骤
我的研究让我想到了这个问题:cant use has_secure_password, password_digest error
PasswordDigest
的字段,当然可以匹配Ruby password_digest
gem 'bcrypt'
并运行bundle install
我可以探索哪些其他选项才能使其正常工作?
答案 0 :(得分:1)
在authenticate
方法中,比较datebase PasswordDigest
字段以验证密码:
passwordDigest == Digest::SHA1.hexdigest(password)
关键点:是Digest::SHA1.hexdigest
,它会将您的普通字符串转换为存储在数据库中的hex
字符串。
require 'digest/sha1'
Digest::SHA1.hexdigest("hello world")
=> "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"
答案 1 :(得分:1)
针对您的问题的快速解决方法(如果您无法在数据库中将PasswordDigest
更改为password_digest
)将为此属性创建外观方法。
如果您查看has_secure_password source code,则可以看到password_digest
的使用位置。
所以你的外观属性看起来像这样:
def password_digest=(astring)
self['PasswordDigest']= astring
end
def password_digest
self['PasswordDigest']
end
不确定这是否足以涵盖所有内容,但这只是一个开始。
否则更改您的数据库字段名!!