2016-06-09 13 views
0

Wie der Titel sagt, verwende ich den Automaten der Statusmaschine, um mehrere Namespaced-State-Maschinen in einem Modell zu erstellen. Wenn eine meiner Statemachines in einen bestimmten Zustand übergeht, versuche ich einen Callback zu verwenden, um ein Ereignis in einer separaten Zustandsmaschine desselben Modells auszulösen, bekomme aber einen Fehler.Rails und der state_machine gem. Verwenden von Callbacks in Namespaced-State-Computern zum Auslösen von Ereignissen in anderen Computern

https://github.com/pluginaweek/state_machine

Dies ist, was ich rufe:

project.status.complete_first 

Und das ist der Fehler Ich erhalte:

NoMethodError: undefined method `start_the_second_state_machine' for #<StateMachines::Machine:0x007f9467974b60> 

Dies ist eine vereinfachte Version meiner Code:

class Status < ActiveRecord::Base 
    belongs_to :project 

    ######### First Machine ######### 
    state_machine :first_machine, initial: :first_pending, :namespace => 'first' do 
    after_transition any => :finished do |transition| 
     self.start_the_second_state_machine 
    end 

    event :complete do 
     transition first_pending: :finished 
    end 
    end 

    ######### Second Machine ######### 
    state_machine :second_machine, initial: :unstarted, :namespace => 'second' do 
    event :start_the_second_state_machine do 
     transition unstarted: :started 
    end 
    end 
end 

Wenn ich die Zeile entferne, gibt es keine Fehler und meine Objektübergänge first_machine, aber das Ereignis muss auch auf meiner second_machine aufgerufen werden. Also, ich weiß, das Problem ist mit self und das ist nicht mein Statusobjekt, aber ich bin mir nicht sicher, wie man darauf zugreifen?

Antwort

1

Versuchen Sie Folgendes:

class Status < ActiveRecord::Base 
    belongs_to :project 

    ######### First Machine ######### 
    state_machine :first_machine, initial: :first_pending, :namespace => 'first' do 
    after_transition any => :finished do |status, transition| 
     status.start_the_second_state_machine 
    end 

    event :complete do 
     transition first_pending: :finished 
    end 
    end 

    ######### Second Machine ######### 
    state_machine :second_machine, initial: :unstarted, :namespace => 'second' do 
    event :start_the_second_state_machine do 
     transition unstarted: :started 
    end 
    end 
end 
+0

Das funktionierte, danke! Ich hatte ein anderes Problem mit der Namensgebung, dass ich auch reparieren musste. – alexandraleigh