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.