has_secure_password: 未定义局部变量或方法 'password_digest' 错误
has_secure_password: undefined local variable or method 'password_digest' error
根据标题,当我尝试对我的用户调用以下代码段时 object:
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
- 我还在我的 gemfile 中包含
gem 'bcrypt'
和 运行 bundle install
- 我还为用户模型更新了我的测试工具(我在网上某处看到作为修复提到的)
我可以探索哪些其他选项来实现此功能?
在authenticate
方法中,像这样比较数据库PasswordDigest
字段来验证密码:
passwordDigest == Digest::SHA1.hexdigest(password)
要点:就是Digest::SHA1.hexdigest
,它会把你的普通字符串转换成hex
存储在数据库中的字符串。
require 'digest/sha1'
Digest::SHA1.hexdigest("hello world")
=> "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"
您的问题的快速解决方法(如果您无法在数据库中将 PasswordDigest
更改为 password_digest
)是为此属性创建外观方法。
如果您查看 has_secure_password source code,您可以看到使用 password_digest
的位置。
所以您的外观属性看起来像这样:
def password_digest=(astring)
self['PasswordDigest']= astring
end
def password_digest
self['PasswordDigest']
end
不确定这是否足以涵盖所有内容,但这是一个开始。
否则更改您的数据库字段名!!
根据标题,当我尝试对我的用户调用以下代码段时 object:
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
- 我还在我的 gemfile 中包含
gem 'bcrypt'
和 运行bundle install
- 我还为用户模型更新了我的测试工具(我在网上某处看到作为修复提到的)
我可以探索哪些其他选项来实现此功能?
在authenticate
方法中,像这样比较数据库PasswordDigest
字段来验证密码:
passwordDigest == Digest::SHA1.hexdigest(password)
要点:就是Digest::SHA1.hexdigest
,它会把你的普通字符串转换成hex
存储在数据库中的字符串。
require 'digest/sha1'
Digest::SHA1.hexdigest("hello world")
=> "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"
您的问题的快速解决方法(如果您无法在数据库中将 PasswordDigest
更改为 password_digest
)是为此属性创建外观方法。
如果您查看 has_secure_password source code,您可以看到使用 password_digest
的位置。
所以您的外观属性看起来像这样:
def password_digest=(astring)
self['PasswordDigest']= astring
end
def password_digest
self['PasswordDigest']
end
不确定这是否足以涵盖所有内容,但这是一个开始。
否则更改您的数据库字段名!!