-1

我正在开发一个 Rails 4 应用程序,它创建一个密钥,在 before_create 上对其进行哈希处理并将其保存在模型中。如果我想重置这个密钥,我可以调用 current_user.touch 并且 before_update 将被调用,并且 before_update 具有与 before_create 相同的方法,因此旧密钥将使用新密钥进行更新。我想在创建时取回那个纯文本密钥,所以我使用 attr_accessor 并在创建时用纯文本填充一个变量,然后我取回很好的密钥。问题是,如果我打电话给触摸,请更新!我返回 true 或 false 而不是记录,因此我无法访问 attr_accessor 变量,如果我尝试重新加载它,那么密钥就消失了,因为它仅在实例中可用。有谁知道在该实例中强制、更新和返回记录本身而不是真或假的方法?

class Key < ActiveRecord::Base
  include BCrypt

  attr_accessor :access_key_hex
  before_update :set_access_key
  before_create :set_access_key

  def access_key
    @access_key ||= Password.new(access_key_hash)
  end

  belongs_to :user

  protected

  def set_access_key
    self.access_key_hex = SecureRandom.hex(50)
    @access_key = Password.create(access_key_hex)
    self.access_key_hash = @access_key
  end
end

在我使用的控制器中@key = active_user.key.update!(nil),它工作得很好,它会自动更新密钥,问题是在更新时检索密钥,在创建它时很好。

4

1 回答 1

0

set_access_key与其在 上作为 ActiveRecord 回调运行,不如touch考虑将 声明set_access_key为公共方法并直接在模型实例上调用该方法:

# app/models/key.rb
class Key < ActiveRecord::Base
    include BCrypt

    attr_accessor :access_key_hex
    # before_update :set_access_key # REMOVE CALLBACK
    # before_create :set_access_key # REMOVE CALLBACK

    def access_key
        @access_key ||= Password.new(access_key_hash)
    end

    belongs_to :user

    def set_access_key
        self.access_key_hex = SecureRandom.hex(50)
        @access_key = Password.create(access_key_hex)
        self.access_key_hash = @access_key
        @access_key # returns access key from the method
    end
end

然后,在您的控制器中,您需要做的就是set_access_key 直接在对象实例上调用,键的值将被分配给@key

@key = active_user.key.set_access_key
print @key #=> value of the access_key_hex
于 2013-07-29T23:30:19.567 回答