2016-04-22 4 views
0

私は方法が唯一の第2の条件が真真すなわちis_admin?場合でも、コールバックレール

before_save :method, :if => :email_changed? && :is_admin? 

のための条件を実行しますしました。 ラムダでうまく動作しますが

before_save :method, :if => lambda { |u| u.email_changed? && u.is_admin? } 

誰でも説明できますか?クラス自体はにロードされるとき、そのようなコードは、静的に実行あるため

答えて

1

あなたは裸:if定義で&& S、|| Sまたは他の同様の演算子を使用することはできません。

特定のステートメント:if => :email_changed? && :is_admin?は、{ :if => :email_changed? && :is_admin? }(中括弧なしでハッシュとして書くことができるbefore_saveメソッドの最後のパラメーター)のように解釈されます。これは最終的に{ :if => :is_admin? }なり、コンソールに自分の目で確かめてください:

{ :if => :email_changed? && :is_admin? } 
# => { :if => :is_admin? } 

それが動的にコールバックが実行されるたびに評価されますように、これを定義する正しい方法は、実際にラムダを使用しています。

+0

ありがとう、素敵な説明。 – mudasir