gpt4 book ai didi

ruby-on-rails - `after_commit` 上的 `update` 回调未触发

转载 作者:行者123 更新时间:2023-12-04 07:29:14 28 4
gpt4 key购买 nike

我已经定义了after_commit回调 update .它不会在 rspec 中触发。

这是我的回调:

after_commit :notify_trip, :if => Proc.new { |trip| trip.can_send_schedule_notification? }, on: :update

这是我的 rspec 代码:
@work_order.update_attributes(:status_id => statuses(:scheduled).id, :tour_id => @tour.id)
@work_order.run_callbacks(:commit)
assert_equal 1, ActionMailer::Base.deliveries.size
expect(ActionMailer::Base.deliveries[0].to).to include(@user.email)
expect(ActionMailer::Base.deliveries[0].subject).to include("Your trip has been scheduled!")

这里回调没有调用和 ActionMailer::Base.deliveries.size返回 0
有没有这方面的建议。

最佳答案

TL;DR

@work_order.update_attributes(:status_id => statuses(:scheduled).id, :tour_id => @tour.id)
@work_order.instance_variable_set(:@_start_transaction_state, {})
@work_order.run_callbacks(:commit)

解释

我对 Rails 4.0.1 也有类似的情况:
@work_order = WorkOrder.create(status_id: 1, order_id: 2)
@work_order.update_attributes(status_id: 4, order_id: 5)
@work_order.run_callbacks(:commit)

当模型实现看起来像这样时:
class WorkOrder < ActiveRecord::Base
after_commit :notify_trip, :if => Proc.new { |trip| trip.can_send_schedule_notification? }, on: :update
after_commit :do_something, on: :create
end

每次我调用 @work_order.run_callbacks(:commit)然后它将在创建方法上运行 after_commit - do_something。发生这种情况是因为在 @work_order 之后由 ( @work_order = WorkOrder.create(status_id: 1, order_id: 2) ) 一个名为 @_start_transaction_state 的实例变量创建已初始化,但从未清除。 @_start_transaction_state据我阅读代码的理解,在 ActiveRecord::Transaction 模块中使用它来跟踪事务过程。

所以在调用 run_callbacks 之前如果我们清理 @_start_transaction_state ,那么我们就可以运行 after_commit on: update回调
@work_order.instance_variable_set(:@_start_transaction_state, {})
@work_order.run_callbacks(:commit)

还有一个更清洁的选项:
@work_order.send(:clear_transaction_record_state)
@work_order.run_callbacks(:commit)

我知道这个解决方案很老套,我不确定这是否会引入一些副作用,尤其是嵌套事务,但它是 Rails 4.0.1 中唯一对我有用的变体。

关于ruby-on-rails - `after_commit` 上的 `update` 回调未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33940268/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com