Ruby on Rails
Stany modelu: AASM
Szukaj…
Stan podstawowy z AASM
Zwykle kończy się tworzenie modeli, które będą zawierały stan, a stan ten będzie się zmieniać w trakcie trwania obiektu.
AASM to biblioteka aktywująca maszyny stanów skończonych, która może pomóc w radzeniu sobie z łatwym przejściem przez proces projektowania obiektów.
Posiadanie czegoś takiego w swoim modelu jest dość zgodne z modelem Fat Model, Skinny Controller , jedną z najlepszych praktyk Railsów. Model ponosi wyłączną odpowiedzialność za zarządzanie swoim stanem, jego zmianami i generowaniem zdarzeń wywołanych przez te zmiany.
Aby zainstalować, w Gemfile
gem 'aasm'
Rozważ aplikację, w której użytkownik wycenia produkt w cenie.
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
Stany klasy Quote mogą iść, jednak najlepiej dla twojego procesu.
Możesz myśleć o stanach jako o przeszłości, jak w poprzednim przykładzie lub o innym czasie, na przykład: ustalanie cen, płacenie, dostarczanie itp. Nazwy stanów zależą od ciebie. Z osobistego punktu widzenia przeszłe stany działają lepiej, ponieważ stan końcowy z pewnością będzie przeszłym działaniem i lepiej łączy się z nazwami zdarzeń, które zostaną wyjaśnione później.
UWAGA: Uważaj, jakich nazw używasz, musisz się martwić, że nie użyjesz słów kluczowych zastrzeżonych w Ruby lub Ruby on Rails, takich jak valid
, end
, being
itp.
Po zdefiniowaniu stanów i przejść możemy teraz uzyskać dostęp do niektórych metod stworzonych przez AASM.
Na przykład:
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.
Jak widać, zdarzenie ma przejścia, przejścia te określają sposób zmiany stanu po wywołaniu zdarzenia. Jeśli zdarzenie jest nieprawidłowe z powodu bieżącego stanu, zostanie zgłoszony błąd.
Na przykład zdarzenia i przejścia mają także inne funkcje zwrotne
guard: product_delivered?
Zadzwoni do produktu dostarczonego product_delivered?
metoda, która zwróci wartość logiczną. Jeśli okaże się fałszem, przejście nie zostanie zastosowane, a jeśli żadne inne przejścia nie będą dostępne, stan się nie zmieni.
success: :reverse_charges
Jeśli tłumaczenie się :reverse_charges
, zostanie wywołana metoda :reverse_charges
.
Istnieje kilka innych metod w AASM z większą liczbą wywołań zwrotnych w tym procesie, ale pomoże to w tworzeniu pierwszych modeli ze stanami skończonymi.