Ruby on Rails
Modelltillstånd: AASM
Sök…
Grundtillstånd med AASM
Vanligtvis kommer du att skapa modeller som kommer att innehålla ett tillstånd, och det tillståndet kommer att förändras under objektets livslängd.
AASM är ett ändligt bibliotek för maskinbegränsande tillstånd som kan hjälpa dig att hantera att du enkelt kan genomgå processdesignen för dina objekt.
Att ha något liknande i din modell går ganska i linje med Fat Model, Skinny Controller- idén, en av Rails bästa metoder. Modellen är ensam ansvarig för att hantera dess tillstånd, dess förändringar och att generera de händelser som utlöses av dessa förändringar.
För att installera i Gemfile
gem 'aasm'
Överväg en app där användaren citerar en produkt till ett pris.
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
Citatklassens stater kan gå men det är bäst för din process.
Du kan tänka på staterna som förflutna, som i föregående exempel eller algo i andra spända, till exempel: prissättning, betalning, leverans osv. Namngivningen av staterna beror på dig. Från en personlig synvinkel fungerar tidigare stater bättre eftersom ditt slutläge säkert kommer att vara en tidigare handling och kopplas bättre samman med händelsens namn, som kommer att förklaras senare.
OBS: Var försiktig med vilka namn du använder, du måste oroa dig för att inte använda Ruby eller Ruby on Rails reserverade nyckelord, som valid
, end
, being
, etc.
Efter att ha definierat tillstånden och övergångarna kan vi nu komma åt vissa metoder skapade av AASM.
Till exempel:
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.
Eftersom du kan se att händelsen har övergångar avgör dessa övergångar hur staten kommer att förändras efter händelseanropet. Om händelsen är ogiltig på grund av det aktuella tillståndet kommer ett fel att tas upp.
Händelserna och övergångarna har också några andra återuppringningar, till exempel
guard: product_delivered?
Kommer du att ringa product_delivered?
metod som kommer att returnera en boolean. Om det visar sig felaktigt kommer övergången inte att tillämpas och om inga andra övergångar är tillgängliga kommer staten inte att ändras.
success: :reverse_charges
Om den översättningen framgångsrikt inträffar :reverse_charges
metoden :reverse_charges
att åberopas.
Det finns flera andra metoder i AASM med fler återuppringningar i processen men det hjälper dig att skapa dina första modeller med ändliga tillstånd.