我一直试图调试这段代码一段时间没有成功......
我的Order
对象回调,在商定服务条款后发送确认电子邮件。用户可以通过两种方式下订单:
create
)订单并当场同意服务条款create
)订单但等待同意服务条款=>稍后,用户同意服务条款(update
)因此,我的回调代码如下所示:
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
被触发两次。但我无法弄清楚为什么因为代码似乎对我来说足够了......
答案 0 :(得分:0)
无论如何,我目前的问题是email_alert正在获取 触发两次。
唯一具有on
选项的回调是:
before_validation
after_commit
after_save
没有此选项,因此会在保存时触发(与after_commit
一起)。
您可以使用after_update
或before_validation
on: :update
。
但我会坐下来思考一种方法,让它成为一个回调,让它before_validation
,并在回调的方法中执行逻辑 。