轨道after_save回调条件



>我有一个回调的条件

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,以便在每次运行回调时动态评估它。

最新更新