has_secure_password:未定义的局部变量或方法' password_digest'错误

时间:2015-11-27 11:39:26

标签: ruby-on-rails ruby bcrypt

根据标题,当我尝试在我的用户对象上调用以下代码段时:

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
  • 我还更新了我的用户模型的测试工具(我在网上看到了提到的修补程序)

我可以探索哪些其他选项才能使其正常工作?

2 个答案:

答案 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

不确定这是否足以涵盖所有内容,但这只是一个开始。

否则更改您的数据库字段名!!