我正在开发一个创建密钥的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)
,它可以正常工作,并且会自动更新密钥,问题是在更新时检索密钥,然后创建它。
答案 0 :(得分:0)
不要在set_access_key
上将touch
作为ActiveRecord回调运行,而是考虑将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