Using AASM for Full State Management

AASM ("Acts as a State Machine") is a Ruby gem that provides a complete state machine solution with enums.

Adding AASM to Your Rails Model

First, install the gem:

bundle add aasm

Then, define a state machine in your model:

class Order < ApplicationRecord
  include AASM

  aasm column: :status, enum: true do
    state :pending, initial: true
    state :confirmed, :shipped, :delivered, :canceled

    event :confirm do
      transitions from: :pending, to: :confirmed
    end

    event :ship do
      transitions from: :confirmed, to: :shipped
    end

    event :deliver do
      transitions from: :shipped, to: :delivered
    end
  end
end

Now, instead of setting statuses manually:

order = Order.new
order.confirm!  # ✅ Works (transitions from pending → confirmed)
order.ship!     # ✅ Works (confirmed → shipped)
order.pending!  # ❌ Raises an error because an order can’t go back to pending

This strictly enforces valid state transitions.

Callbacks in AASM for Automatic Actions

You can trigger actions automatically when a state changes.

Example: Sending Notifications on Status Change

class Order < ApplicationRecord
  include AASM

  aasm column: :status, enum: true do
    state :pending, initial: true
    state :confirmed, :shipped, :delivered, :canceled

    event :confirm do
      transitions from: :pending, to: :confirmed, after: :send_confirmation_email
    end
  end

  private

  def send_confirmation_email
    OrderMailer.confirmation_email(self).deliver_later
  end
end

Now, when you call order.confirm!, it automatically sends an email.