我有一个:after_update
挂钩,可以在订单状态发生变化时发送电子邮件。似乎未通过以下测试,因为:order_status_id_chaned?
返回false。
测试:
context 'when the order_status changes' do
it 'should send an email' do
@order2.save
expect(subject).to receive(:send_confirmation_email)
@order2.update(order_status_id: 2)
end
end
Order.rb
class Order < ApplicationRecord
after_update :send_confirmation_email, if: :order_just_submitted?
def order_just_submitted?
p self.order_status_id_changed? # prints false
p self.is_submitted? # prints true
self.order_status_id_changed? and self.is_submitted?
end
def send_confirmation_email
...
end
end
知道为什么:order_status_id_chaned?
在更新值后会返回false吗?
order_status_id_changed?
在被调用时是错误的,因为它只在更新后调用。保存记录后,更改将移至previous_changes
,因此您可以执行以下操作:
def order_just_submitted?
previous_changes.keys.include?('order_status_id') && is_submitted?
end
此外,除非您想要在任何状态更改时触发电子邮件,否则您可能需要检查状态更改的内容。