2016-10-10 13 views
0

私はRails-4.2.6、state_machine-1.2.0およびRuby-2.3 を使用しています。ステートマシンafter_transitionコールバックが更新時に動作しない

state_machine :status, initial: :initiated do 
    after_transition on: :succeeded, do: :oderable_success_callback 
    event :pending do 
     transition initiated: :pending 
    end 

    event :failed do 
     transition [:initiated, :pending] => :failed 
    end 

    event :succeeded do 
     transition [:initiated, :pending] => :succeeded 
    end 
    end 

    def oderable_success_callback 
    orderable.successful_payment 
    end 

次のような順序を更新すると、after_transitionコールバックがトリガーされます。

order.succeeded

が、私は

order.update(status: 'succeeded') 

statusとして順序を更新して文句を言わないトリガーのコールバックは、 'succeeded' に更新しますが、コールバックをトリガするために失敗しています。

after_transitionコールバックを通常のupdateでトリガーするにはどうすればよいですか。

答えて

1

order.updateは、after_transitionコールバックをトリガーしません。列の変更を検出する場合。モデルのafter_updateコールバックを使用できます。次のように

class Order < ActiveRecord::Base 
    after_update :tasks 
    def tasks 
    if(self.status_changed? && status == 'succeeded') 
     oderable_success_callback 
    end 
    end 
end 
+0

は、応答をありがとうございました。実際に私はステータスに応じて複数のコールバックを持っています。私がこれのようにトリガーするなら、多くのif/elseが書く必要があります。 –

0

私は状況に応じて、複数のコールバックを持っていた場合/他の複数のを避けるため、私は、

after_update :orderable_callback 

state_machine :status, initial: :initiated do 
    event :pending do 
     transition initiated: :pending 
    end 

    event :failed do 
     transition [:initiated, :pending] => :failed 
    end 

    event :succeeded do 
     transition [:initiated, :pending] => :succeeded 
    end 

    state :pending do 
     def orderable_callback 
     orderable.pending_payment 
     end 
    end 

    state :failed do 
     def orderable_callback 
     orderable.failed_payment 
     end 
    end 

    state :succeeded do 
     def orderable_callback 
     orderable.successful_payment 
     end 
    end 
    end 
関連する問題