2010-01-07 10 views
5

Ich verwende die rubyist-aasm State Machine für die Behandlung der verschiedenen Zustände in meinem Event-Objekt (Ereignis initialisiert, Ereignis diskutiert, Ereignis veröffentlicht, etc.). Ich habe Wächter hinzugefügt, um Zustandsänderungen zu verhindern, wenn bestimmte Bedingungen nicht erfüllt werden.Rails Fehlerbehandlung mit AASM State Machine

Dies alles funktioniert gut, aber es zeigt keine Fehler, wenn eine Statusänderung von der Wache abgelehnt wurde. Irgendeine Idee, wie ich den Staat sehen kann, hat sich nicht geändert? Ich könnte die Zustände manuell überprüfen, aber es klingt wie eine hässliche Lösung.

aasm_state :firststate 
aasm_state :secondstate 

aasm_event :approve do 
    transitions :to => :secondstate, :from => [:firststate], :guard => :has_a_price? 
end 

def has_a_price? 
    self.price.present? 
end 

Antwort

0

Ich weiß in Rubyist-Aasm 2.0.2 können Sie hinzufügen hinzufügen "!" zu dem Übergangsmethodenaufruf, der false zurückgibt, wenn der Übergang fehlgeschlagen ist. Also sagen wir, Sie haben eine Controller-Methode namens approve:

def approve 
    @event = Event.find params[:id] 

    if @event.approve! 
    # transition occurred 
    else 
    # handle the failed transition (flash or errors) 
    end 
end 

Lassen Sie mich wissen, was Sie denken?

+0

Danke, das würde im Controller funktionieren, aber ich möchte diese Dinge im Modell behalten. Mit Ihrer Lösung könnte ich den Übergang noch in einem anderen Modell verwenden, ohne die Validierung zu bestehen. – Cimm

+1

Ah, ok. IMO die Wache ist nicht wirklich ein Validierungsfehler so weit wie das AR-Modell betroffen ist, aber es ist eine Wache, die einfach schützt den Übergang von der Staatsmaschine auftreten, ich persönlich wäre glücklich mit dem Aufruf der! Methode (in einem anderen Modell oder Controller) und überprüfen Sie die Rückkehr. Du kannst nichts "sehen", wenn du nicht fragst? Ich könnte hier völlig falsch liegen, also werde ich mich freuen zu sehen, ob irgendwelche anderen Lösungen auftauchen. Wenn Sie auch wirklich einen Validierungsfehler wünschen, können Sie etwas wie validates_presence_of hinzufügen: price,: if => "self.second_state?" – tsdbrown

2

Mit SimpleStateMachine können Sie Zustandsübergänge durch Hinzufügen von Fehlern schützen:

def approve 
    errors.add(:price, 'Invalid') if price.blank? 
end 
event :approve, :firststate => :secondstate 

in diesem Fall Obwohl der Preis anwesend ist mit dem Ereignisse nicht verwendet, so wäre es genug zu tun:

validates_presence_of :price, :if => "self.second_state?" 
event :approve, :firststate => :secondstate