2017-03-17 46 views
0

我有一個方法普通老式的Ruby方法不更新時間

def call 
    user.password_reset_sent_at = Time.zone.now 
    user.save! 
    user.regenerate_password_reset_token 
    UserMailer.password_reset(user).deliver_later(queue: "low") 
end 

def user 
    @user = User.find_by_email(@params) 
end 

,我想重置password_reset_token和password_reset_sent_at

User::PasswordReset.new("[email protected]").call 

我看到令牌更新,但它不更新password_reset_sent_at

回答

1

user每次出現calluser方法的另一個調用,cr從數據庫中的記錄中吃另一個User對象並將其存儲在@user中。你去得到一個新的副本之前的效果是相似,如果你寫了

def call 
    User.find_by_email(@params).password_sent_at = Time.zone.now 
    User.find_by_email(@params).save! 
    ... etc ... 
end 

您對您檢索的用戶記錄的第一副本的變化,從不保存。

我想你瞄準了包括定義user這樣的成語:

def user 
    @user ||= User.find_by_email(@params) 
end 

定義的方式,User.find_by_email只會被調用一次,並存儲在@user結果。對user的後續調用將重新使用@user的現有值,該技術名爲memoization