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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow