Zoeken…


Basistoestand met AASM

Meestal maak je uiteindelijk modellen die een status bevatten en die status verandert tijdens de levensduur van het object.

AASM is een eindige state machine enabler bibliotheek die u kan helpen bij het omgaan met het gemakkelijk doorlopen van het procesontwerp van uw objecten.

Het hebben van zoiets in je model komt redelijk overeen met het Fat Model, Skinny Controller- idee, een van de best practices van Rails. Het model is de enige verantwoordelijke voor het beheer van zijn status, zijn wijzigingen en voor het genereren van de gebeurtenissen die door die veranderingen worden veroorzaakt.

Te installeren, in Gemfile

gem 'aasm'

Overweeg een app waarbij de gebruiker een product citeert voor een prijs.

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

De status van de Citaat-klasse kan gaan, maar het is het beste voor uw proces.

Je kunt de staten als verleden beschouwen, zoals in het vorige voorbeeld of in andere tijden, bijvoorbeeld: prijzen, betalen, leveren, enz. De naamgeving van de staten hangt van jou af. Vanuit een persoonlijk oogpunt werken eerdere staten beter omdat uw eindstaat zeker een actie uit het verleden zal zijn en beter aansluit bij de namen van evenementen, die later zullen worden uitgelegd.

OPMERKING: wees voorzichtig met de namen die u gebruikt, u moet zich zorgen maken dat u geen gereserveerde zoekwoorden van Ruby of Ruby on Rails gebruikt, zoals valid , end , being , enz.

Nadat de statussen en overgangen zijn gedefinieerd, hebben we nu toegang tot een aantal methoden die door AASM zijn gemaakt.

Bijvoorbeeld:

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.

Zoals u kunt zien, heeft de gebeurtenis overgangen, deze overgangen bepalen de manier waarop de status verandert bij de gebeurtenisoproep. Als de gebeurtenis ongeldig is vanwege de huidige status, wordt er een fout gegenereerd.

De gebeurtenissen en overgangen hebben bijvoorbeeld ook een aantal andere callbacks

guard: product_delivered?

Zal het product_delivered? methode die een Boolean retourneert. Als het vals blijkt te zijn, wordt de overgang niet toegepast en als er geen andere overgangen beschikbaar zijn, verandert de status niet.

success: :reverse_charges

Als die vertaling met succes gebeurt, wordt de methode :reverse_charges aangeroepen.

Er zijn verschillende andere methoden in AASM met meer callbacks in het proces, maar dit helpt u bij het maken van uw eerste modellen met eindige toestanden.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow