Rails触摸并返回attr_accessor

时间:2013-07-29 22:46:43

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

我正在开发一个创建密钥的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),它可以正常工作,并且会自动更新密钥,问题是在更新时检索密钥,然后创建它。

1 个答案:

答案 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