2010-12-31 4 views
2

Hoffentlich ist das keine alberne Frage, und ich bin einfach nicht etwas in Ruby/Rails-Automaten (AASM, Transitions, AlterEgo, etc) zu übersehen.Gibt es Ruby/Rails-Statusmaschinen, die Ereignisübergänge ausführen, wenn eine Statusänderung auftritt?

Von dem, was ich sagen kann, diese State-Machine-Implementierungen arbeiten im Vorwort, dass ein Ereignis ausgelöst wird und der entsprechende Übergang für das Ereignis wird basierend auf dem alten und neuen Zustand ausgelöst werden. Sie scheinen jedoch nicht anders zu funktionieren; sagen, ein Benutzer möchte den Status von "erstellt" in "zugewiesen" ändern und den korrekten Übergang durchführen, anstatt das Ereignis auszulösen, das den aktuellen Status in den neuen Zustand überführen lässt.

Im Wesentlichen möchte ich, dass der Benutzer in der Lage ist, einen neuen Zustand aus einer Auswahl von verfügbaren Zuständen auszuwählen und die entsprechenden Transitionen, Wächter, Erfolgsrückrufe usw. ausführen zu lassen.

Weiß jemand, ob die vorhandenen State Machine-Implementierungen das unterstützen?

Antwort

0

Sie können erreichen, was Sie mit meinem Edelstein flojo tun möchten. Benennen Sie Ereignisse nach Zuständen und lassen Sie diese Ereignisse einen Übergang vom Platzhalterzustand zu dem in der Dropdown-Liste ausgewählten Zustand auslösen.

Wenn Sie ein Zustand „pending“ in Ihrem Dropdown haben, können Sie ein flojo Ereignis mit dem folgenden Snippet konfigurieren

event :pending do 
    # :any is a wildcard state and is only valid as a begin state. 
    transition :any, :pending 
end 

nach dem Formular abgeschickt wird, würden Sie dann das Präfix müssen „pending“ mit "wf_", wandle es in ein Symbol um und sende es dann an dein Objekt. Es wäre sauberer, einfach eine Methode in Ihrer Klasse zu erstellen, die die Präfix- und Symbolkonvertierung vornimmt und dann delegiert, um zu senden.

your_object.send :wf_pending 

https://github.com/alternegro/flojo

2

Zustandsmaschinen erlauben es nicht, willkürlich in einen beliebigen Zustand im System zu springen. Jeder hat einen Einstiegspunkt und jedes Mal, wenn Sie den Status ändern möchten, werden einige Bedingungen ausgewertet (von denen eines das Eingabeereignis sein kann) und der nächste Zustand ist das Ergebnis dieser Bedingungen. Sie könnten jedoch eine Zustandsmaschine mit Übergängen haben, die von jedem Zustand zu jedem anderen Zustand definiert sind.

class Ticket 
    acts_as_state_machine :initial => :new 

    state :new 
    state :open 
    state :resolved 

    event :open do 
    transitions :to => :open, 
     :from => [:new, :resolved], :guard => :can_be_open? 
    end 

    event :new do 
    transitions :to => :new, 
     :from => [:open, :resolved], :guard => :can_be_new? 
    end 

    event :resolved do 
    transitions :to => :resolved, 
     :from => [:open, :new], :guard => :can_be_resolved? 
    end 

    private 

    def can_be_resolved? 
    !resolution.blank? 
    end 

    ... 

end 

@ticket = Ticket.create 
@ticket.state # => new 
@ticket.resolved! 
@ticket.state # => resolved 

So würden Sie brauchen, um den gewünschten Zustand aus der Dropdown-Liste zu überprüfen und den richtigen Übergang als Ergebnis aufrufen. Sie können so einfach wie attr_accessor :new_state und dann eine new_state => event Zuordnung oder Case-Anweisung verwenden, die Ihr Modell before_validation aufruft.

+0

Ok, also denke ich, den entscheidenden Punkt weg hier zu nehmen ist, kann es Ereignisnamen, die Zustandsnamen so übereinstimmen, dass Auswahlbox Wert Zustandsnamen sein kann und mit ‚-Modell verwendet werden # send ', um ein Ereignis auszulösen. Recht? – Bryan

Verwandte Themen