Ruby on Rails
Modellzustände: AASM
Suche…
Grundzustand bei AASM
Normalerweise erstellen Sie am Ende Modelle, die einen Zustand enthalten, und dieser Zustand ändert sich während der Lebensdauer des Objekts.
AASM ist eine Finite-State-Machine-Enabler-Bibliothek, die Ihnen beim einfachen Durcharbeiten des Prozessdesigns Ihrer Objekte helfen kann.
Wenn Sie so etwas in Ihrem Modell haben, stimmt das mit der Idee von Fat Model, Skinny Controller , einer der besten Methoden von Rails, überein. Das Modell ist allein verantwortlich für die Verwaltung seines Zustands, seiner Änderungen und für das Generieren der durch diese Änderungen ausgelösten Ereignisse.
Zu installieren, in Gemfile
gem 'aasm'
Betrachten Sie eine App, in der der Benutzer ein Produkt zu einem Preis anbietet.
class Quote
include AASM
aasm do
state :requested, initial: true # User sees a product and requests a quote
state :priced # Seller sets the price
state :payed # Buyer pays the price
state :canceled # The buyer is not willing to pay the price
state :completed # The product has been delivered.
event :price do
transitions from: requested, to: :priced
end
event :pay do
transitions from: :priced, to: :payed, success: :set_payment_date
end
event :complete do
transitions from: :payed, to: :completed, guard: product_delivered?
end
event :cancel do
transitions from: [:requested, :priced], to: :canceled
transitions from: :payed, to: canceled, success: :reverse_charges
end
end
private
def set_payment_date
update payed_at: Time.zone.now
end
end
Die Statusklassen der Quote-Klasse können jedoch verwendet werden. Dies ist jedoch am besten für Ihren Prozess.
Sie können sich die Zustände als Vergangenheit vorstellen, wie im vorherigen Beispiel oder auch in einer anderen Form, zum Beispiel: Preise, Zahlung, Lieferung usw. Die Benennung der Zustände hängt von Ihnen ab. Aus persönlicher Sicht funktionieren vergangene Zustände besser, da Ihr Endzustand sicherlich eine vergangene Aktion ist und eine bessere Verknüpfung mit den Ereignisnamen herstellt, was später erläutert wird.
HINWEIS: Achten Sie darauf , welche Namen Sie verwenden, müssen Sie sich Sorgen über nicht mit Ruby oder Ruby on Rails reservierten Schlüsselwörter, wie valid
, end
, being
usw.
Nachdem wir die Zustände und Übergänge definiert haben, können wir nun auf einige von AASM erstellte Methoden zugreifen.
Zum Beispiel:
Quote.priced # Shows all Quotes with priced events
quote.priced? # Indicates if that specific quote has been priced
quote.price! # Triggers the event the would transition from requested to priced.
Wie Sie sehen können, dass das Ereignis Übergänge hat, bestimmen diese Übergänge, wie sich der Zustand beim Ereignisaufruf ändert. Wenn das Ereignis aufgrund des aktuellen Status ungültig ist, wird ein Fehler ausgegeben.
Die Ereignisse und Übergänge haben beispielsweise auch andere Rückrufe
guard: product_delivered?
product_delivered?
das product_delivered?
Methode, die einen Boolean zurückgibt. Wenn es sich als falsch herausstellt, wird der Übergang nicht angewendet. Wenn keine anderen Übergänge verfügbar sind, ändert sich der Status nicht.
success: :reverse_charges
Wenn diese Übersetzung erfolgreich durchgeführt wird, wird die :reverse_charges
Methode aufgerufen.
Es gibt mehrere andere Methoden in AASM mit mehr Rückrufen im Prozess. Dies hilft Ihnen jedoch, Ihre ersten Modelle mit endlichen Zuständen zu erstellen.