Ruby on Rails
Model verklaart: AASM
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.