>我有一个回调的条件
before_save :method, :if => :email_changed? && :is_admin?
即使只有第二个条件为真,即is_admin?
为真,该方法也会执行。虽然它与 lambda 一起工作得很好
before_save :method, :if => lambda { |u| u.email_changed? && u.is_admin? }
谁能解释一下?
不能在裸: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? }
定义它的正确方法确实是使用 lambda,以便在每次运行回调时动态评估它。