2014-05-24 79 views
1

這裏是我的情況 我需要:生成用戶確認代碼,如果用戶的電子郵件已經改變rails helper方法如何:attribute_changed?在Rails 3.2.15中工作?

我有 型號:

class User < ActiveRecord::Base 
... 
    after_update :generate_confirm_code if :email_changed? 
... 
    def generate_confirm_code 
    self.confirmation_code = SecureRandom.urlsafe_base64.first(8) 
    self.confirmed = false 
    end 

    def update_last_visit 
    self.last_visit = Time.now.utc 
    save 
    end 
... 
end 

也有一個方法:在application_controller update_last_visit從而節省了用戶的最後訪問時間

class ApplicationController < ActionController::Base 
... 
    def update_last_visit 
    current_user.update_last_visit if current_user 
    end 
... 
end 

這裏的問題開始: 每次我重新加載頁面我確認碼變化時,曝光當我沒有更改電子郵件時。看起來像更新last_visit也改變了confirmation_code,但爲什麼?

回答

3

你只是在你的宏after_update上有些語法錯誤。就像你現在使用的那樣,if :email_changed?實際上只是加載User類時是否運行after_update宏的修飾符。即它與puts "hi" if :some_condition?相同(if不是此處puts方法的輸入)。

你需要的是一個:if選項傳遞給after_update宏,就像這樣:

after_update :generate_confirm_code, if: :email_changed? 

注意,if:現在植根於after_update宏的選項哈希值。請參閱Rails Guide on ActiveRecord Callbacks

+0

非常感謝! :) – Art

+0

這也解決了我的第二個問題http://stackoverflow.com/questions/23797041/how-to-skip-format-validation-in-my-case – Art

+1

很酷,很高興我釘了一個2 - :)。那麼你可能想刪除那個其他問題?或者提供答案並接受它來清除它。 – pdobb