我的模型看起来像这样
require 'bcrypt'
class Authorization < ActiveRecord::Base
before_save :encrypt_password
# some validations and other methods
def encrypt_password
if password.present?
self.password_salt = BCrypt::Engine.generate_salt
self.password_encrypted = BCrypt::Engine.hash_secret(password, password_salt)
end
end
def self.authenticate(hash)
auth = where(provider: 'email', email: hash[:email])
if auth and auth.password_encrypted == BCrypt::Engine.hash_secret(hash[:password], auth.password_salt)
auth
else
nil
end
end
end
但是在我的控制器中,我使用Authorization.authenticate(hash)
给出的散列调用params.permit(:email, :password)
,当它实际存在时,我得到未定义的方法`password_encrypted'。
答案 0 :(得分:1)
您的authenticate
类方法返回的是关系而不是实例,这就是您的实例变量不可用的原因。
您必须修改authenticate方法的第一行,看起来像这样:
auth = where(provider: 'email', email: hash[:email]).first
或者
auth = find_by(provider: 'email', email: hash[:email])
确保你正在处理Authorization
的实例而不是where
调用返回的关系(即使它只返回一条记录)。