2016-10-10 2 views
0

Ich verwende Rails-4.2.6, state_machine-1.2.0 und Ruby-2.3 Ich hatte State Machine auf Order-Modell definiert. Wie folgtState Machine after_Transition Callback funktioniert nicht auf Update

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 

Wenn ich Reihenfolge wie folgt aktualisieren, wird nach Rückruf Rückruf ausgelöst.

order.succeeded

aber es wird nicht Trigger Rückruf, wenn ich, um als

order.update(status: 'succeeded') 

status wird aktualisiert, um 'succeeded' aktualisieren, aber nicht Rückruf auszulösen.

Wie kann ich after_transition Rückrufe auf normale update auslösen.

Antwort

1

order.update löst keinen after_transition-Rückruf aus. Wenn Sie Änderungen an der Spalte erkennen möchten. Sie können den after_update Callback des Modells verwenden.

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

Sie für die Antwort danken. Tatsächlich habe ich mehrere Rückrufe abhängig vom Status. Wenn ich so triggere, dann müssen viele If/Else schreiben. –

0

Ich hatte mehrere Rückrufe auf Status abhängig und mehrere zu vermeiden, wenn/sonst, ich wie folgt hatte,

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