2013-07-29 29 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