Ruby on Rails
Модельные состояния: AASM
Поиск…
Основное состояние с 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 с большим количеством обратных вызовов в процессе, но это поможет вам создать свои первые модели с конечными состояниями.