访问模型内​​的字段时出现未定义的方法错误

时间:2015-05-26 21:07:20

标签: ruby-on-rails ruby ruby-on-rails-4

我的模型看起来像这样

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'。

1 个答案:

答案 0 :(得分:1)

您的authenticate类方法返回的是关系而不是实例,这就是您的实例变量不可用的原因。

您必须修改authenticate方法的第一行,看起来像这样:

auth = where(provider: 'email', email: hash[:email]).first

或者

auth = find_by(provider: 'email', email: hash[:email])

确保你正在处理Authorization的实例而不是where调用返回的关系(即使它只返回一条记录)。