代码之家  ›  专栏  ›  技术社区  ›  Jeremy Thomas

udpate rails回调测试失败后

  •  1
  • Jeremy Thomas  · 技术社区  · 7 年前

    我有一个 :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
    

    知道为什么吗 :订单\状态\标识\更改? 更新值后是否返回false?

    1 回复  |  直到 7 年前
        1
  •  1
  •   infused    7 年前

    order_status_id_changed? 在调用时为false,因为它仅在更新后调用。保存记录后,更改将移动到 previous_changes ,因此您可以执行以下操作:

    def order_just_submitted?
      previous_changes.keys.include?('order_status_id') && is_submitted?
    end
    

    此外,您可能希望检查状态更改为什么,除非您希望在任何状态更改时触发电子邮件。