我正在开发一个 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)
,它工作得很好,它会自动更新密钥,问题是在更新时检索密钥,在创建它时很好。