2017-07-08 16 views
0

フィールドが変更され、レコードレコードでない場合にのみ、rails4アプリケーションでフックを実行する必要があります。before_saveフィールド値が変更された場合は、新しいレコードを除いて

before_save :reset_confirmation, unless: new_record? 
    def reset_confirmation 
    self.confirmed_at = nil 
    self.confirmation_sent_at = nil 
    end 

が、どのように私は2つを組み合わせて、または容易に存在しない...私は

before_save :reset_confirmation, if: :email_changed? 
    def reset_confirmation 
    self.confirmed_at = nil 
    self.confirmation_sent_at = nil 
    end 

...私が行うことができます知っていると私はこの作品かなり確信しています私が欲しいものを達成する方法と私は事をoverthinkingしています。フィールド(電子メール)には、それが作成された後に常に値が含まれています。

答えて

1

あなたはこのように、あなたのコールバックで複数の条件を使用することができます。

before_save :reset_confirmation, if: :email_changed?, unless: :new_record? 

def reset_confirmation 
    self.confirmed_at = nil 
    self.confirmation_sent_at = nil 
end 

それとも、あなたはたとえば、両方の条件を確認するために、別の方法を追加することができます。

before_save :reset_confirmation, if: :email_changed_and_its_not_new_record? 

def reset_confirmation 
    self.confirmed_at = nil 
    self.confirmation_sent_at = nil 
end 

def email_changed_and_its_not_new_record? 
    email_changed? && !new_record? 
end 

あなたはより多くの情報を見つけることができます条件付きコールバックの場合here

0

私はロジックがbefore_updateが唯一の新しいレコードの問題の世話をされ、既存のレコード上で実行され、今ではにステップしないということで...最後にこれで

before_update :reset_confirmation, if: :email_changed? 
    def reset_confirmation 
    self.confirmed_at = nil 
    self.confirmation_sent_at = nil 
    end 

を行ってきましたフィールドをリセットするための条件が満たされていない場合は、このメソッドを使用します。

0

コールバックは、明示的なセッターメソッドに置き換えられたときに、クラスの可読性と保守性が向上した場合、私は疑問に思う:

def email=(new_email) 
    unless new_email == email 
    self.confirmed_at = nil 
    self.confirmation_sent_at = nil 
    write_attribute(:email, new_email) 
    end 
end 
関連する問題