2013-07-29 28 views
-1

我正在创建一个键的Rails 4应用程序,将其散列在before_create上并将其保存在模型中。如果我想重置此密钥,我可以调用current_user.touch并调用before_update,并且before_update与before_create具有相同的方法,因此旧密钥将更新为新密钥。我想在创建时获取纯文本密钥,所以我使用attr_accessor并在创建时使用纯文本填充变量,然后返回无损的密钥。问题是,如果我打电话,更新!我返回真或假而不是记录,所以我不能访问attr_accessor变量,如果我尝试重新加载它,那么键已经消失,因为它只在实例中可用。有没有人知道强制更新并在该实例中返回记录本身的方法,而不是真或假?Rails触摸并返回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

你可以发布你的模型代码吗? – zeantsoi

+0

@zeantsoi完成。 – ny95

+0

作为供参考,您可以通过使用'after_save'回调来干掉你的代码,这个回调包含'before_create'和'before_update'。 – zeantsoi

回答

0

而不是在touch运行set_access_key作为一个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 
+0

对不起,我没有提到这一点,但有两个关键而不是一个。我只是拿出另一个来解释这个问题更容易。 – ny95

+0

如果你不提供详细信息,问这个问题有什么意义?对于任何人来说,回答都不是一件容易的事情,只是要被告知已经隐瞒了一条重要的信息。照顾更新你的问题? – zeantsoi

+0

好吧,所以你有两个键而不是一个。这个解决方案是否有效会改变吗? – zeantsoi