Поиск…


Основное состояние с AASM

Обычно вы создадите модели, которые будут содержать состояние, и это состояние будет меняться в течение срока службы объекта.

AASM - это библиотека конечных состояний, которая может помочь вам справиться с легким прохождением процесса проектирования ваших объектов.

Наличие чего-то подобного в вашей модели вполне согласуется с идеей Fat Model, Skinny Controller , одной из лучших практик Rails. Модель является единственным ответственным за управление своим состоянием, его изменениями и генерированием событий, вызванных этими изменениями.

Для установки в Gemfile

gem 'aasm'

Рассмотрим приложение, в котором пользователь заказывает продукт по цене.

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

Считается, что состояния класса Quote могут идти, но это лучше всего для вашего процесса.

Вы можете думать о состояниях как о прошлом, как в предыдущем примере или в другом в другом времени, например: ценообразование, оплата, доставка и т. Д. Именование государств зависит от вас. С личной точки зрения, прошлые состояния работают лучше, потому что ваше конечное состояние, безусловно, будет прошлым действием и лучше свяжется с именами событий, которые будут объяснены позже.

ПРИМЕЧАНИЕ. Будьте осторожны, какие имена вы используете, вам нужно беспокоиться о том, что нельзя использовать зарезервированные ключевые слова Ruby или Ruby on Rails, такие как valid , end , being и т. Д.

Определив состояния и переходы, мы можем теперь получить доступ к некоторым методам, созданным AASM.

Например:

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.

Поскольку вы видите, что события имеют переходы, эти переходы определяют способ изменения состояния при вызове события. Если событие недействительно из-за текущего состояния, возникает ошибка.

События и переходы также имеют некоторые другие обратные вызовы, например

guard: product_delivered?

product_delivered? метод, который возвращает логическое значение. Если это окажется ложным, переход не будет применяться, и если другие переходы не будут доступны, состояние не изменится.

success: :reverse_charges

Если этот перевод успешно выполняется, будет вызван метод :reverse_charges .

Существует несколько других методов в AASM с большим количеством обратных вызовов в процессе, но это поможет вам создать свои первые модели с конечными состояниями.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow