回调被触发两次

时间:2016-09-28 02:33:55

标签: ruby-on-rails ruby ruby-on-rails-4 callback

我一直试图调试这段代码一段时间没有成功......

我的Order对象回调,在商定服务条款后发送确认电子邮件。用户可以通过两种方式下订单:

  1. 用户放置(create)订单并当场同意服务条款
  2. 用户放置(create)订单但等待同意服务条款=>稍后,用户同意服务条款(update
  3. 因此,我的回调代码如下所示:

    class Order
      include ActiveModel::Dirty
    
      # for scenario 1
      after_commit :email_alert, on: :create 
    
      #for scenario 2, executes only if agree_tos is changed because user could update other
      #things about the order WITHOUT agreeing to terms. Also agree_tos_changed? is enough
      #because it will only ever change to true, there's no nil or false option 
      after_save :email_alert, on: :update, if: :agree_tos_changed? 
    end
    

    ActiveModel::Dirty工作正常,因为我在其他地方也有。无论如何,我目前的问题是email_alert被触发两次。但我无法弄清楚为什么因为代码似乎对我来说足够了......

1 个答案:

答案 0 :(得分:0)

  

无论如何,我目前的问题是email_alert正在获取   触发两次。

唯一具有on选项的回调是:

  • before_validation
  • after_commit

after_save没有此选项,因此会在保存时触发(与after_commit一起)。

您可以使用after_updatebefore_validation on: :update

但我会坐下来思考一种方法,让它成为一个回调,让它before_validation,并在回调的方法中执行逻辑