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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow