不确定为什么这个update_attribute不能用于我对会话#dault动作的令牌更改

时间:2014-08-05 13:43:03

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

希望小照片还可以!

the console when debugging with pry

您可以看到更新无效。这是模型,也许你可以告诉我它为什么不起作用。

session.rb

module CWB
  class Session < CWB::Resource
    def self.authenticate(name, password)
      account = CWB::Account.find_by_name(name)
      account if BCrypt::Password.new(account.password_hash) == password
    end

    def self.reset_auth_token(session_token)
      account = CWB::Account.find_by_token(session_token)
      new_token = SecureRandom.hex
      binding.pry
      account.update_attribute(:token, new_token)
    end
  end
end

account.rb

require 'bcrypt'

module CWB
  class Account < ActiveRecord::Base
    include BCrypt
    attr_accessor :password
    validates_presence_of :name, :email, :password, on: :create
    before_save :encrypt_password
    before_create :set_auth_token

    private

    def set_auth_token
      return if token.present?

      begin
        self.token = SecureRandom.hex
      end while self.class.exists?(token: token)
    end

    def encrypt_password
      return false unless password.present?
      self.password_hash = BCrypt::Password.create(password)
    end
  end
end

1 个答案:

答案 0 :(得分:2)

encrypt_password模型上的CWB::Account回调返回false并回滚保存。这是因为您没有将任何内容传递到password属性,因此password.present?为false。

如果没有提供密码,您应该只返回true,这样只有在您输入密码时才进行加密和密码更新。