aasm-coder について
aasm-coder は、AASM でワークフローの状態を管理する方法を Rails 開発者向けに解説するスキルです。ガード、コールバック、エラー処理、テストを扱います。
主な機能
- 01AASM のステートマシンパターン
- 02ガード付き・複数の状態遷移
- 03状態とイベントのコールバック
- 04安全な失敗処理と例外処理
- 05RSpec によるステートマシンテスト
活用シーン
- 01Rails の注文ライフサイクルのモデル化
- 02ワークフロー遷移へのガード適用
- 03状態変更時のコールバック実行
- 04RSpec によるステートマシンのテスト
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ majesticlabs-dev/ majestic-marketplace --skill aasm-coderインストール後、Claude Code で/aasm-coderを入力して読み込まれたか確認します。
詳細
AASM Coder
Rails でワークフローの状態を管理するためのステートマシンパターンです。
セットアップ
# Gemfile
gem "aasm", "~> 5.5"
基本的なステートマシン
class Order < ApplicationRecord
include AASM
aasm column: :status do
state :pending, initial: true
state :paid
state :processing
state :shipped
state :cancelled
event :pay do
transitions from: :pending, to: :paid
after do
OrderMailer.payment_received(self).deliver_later
end
end
event :process do
transitions from: :paid, to: :processing
end
event :ship do
transitions from: :processing, to: :shipped
end
event :cancel do
transitions from: [:pending, :paid], to: :cancelled
before do
refund_payment if paid?
end
end
end
end
使用方法
order = Order.create!
order.pending? # => true
order.may_pay? # => true
order.pay! # Transition + callbacks
order.paid? # => true
order.may_ship? # => false (must process first)
order.aasm.events # => [:process, :cancel]
# Scopes created automatically
Order.pending
Order.paid.where(user: current_user)
ガード
event :pay do
transitions from: :pending, to: :paid, guard: :payment_valid?
end
def payment_valid?
payment_method.present? && total > 0
end
# Usage
order.pay! # Raises AASM::InvalidTransition if guard fails
order.pay # Returns false (no exception)
コールバック
aasm do
# State callbacks
state :paid, before_enter: :validate_payment,
after_enter: :send_receipt
# Event callbacks
event :ship do
before do
generate_tracking_number
end
after do
notify_customer
end
transitions from: :processing, to: :shipped
end
end
コールバックの順序:
before(イベント)before_exit(旧状態)before_enter(新状態)- 状態変更を永続化
after_exit(旧状態)after_enter(新状態)after(イベント)
複数の遷移
event :approve do
transitions from: :pending, to: :approved, guard: :auto_approvable?
transitions from: :pending, to: :review, guard: :needs_review?
transitions from: :pending, to: :rejected # fallback
end
最初に一致したガードが優先されます。
エラー処理
# Safe (returns false on failure)
order.pay # => false if invalid
# Raises exception
begin
order.pay!
rescue AASM::InvalidTransition => e
Rails.logger.error("Invalid transition: #{e.message}")
end
# Check before transition
if order.may_pay?
order.pay!
end
ステートマシンのテスト
RSpec.describe Order do
let(:order) { create(:order) }
it "starts in pending state" do
expect(order).to be_pending
end
describe "pay event" do
it "transitions to paid" do
expect { order.pay! }
.to change(order, :status).from("pending").to("paid")
end
it "sends payment received email" do
expect(OrderMailer).to receive_message_chain(:payment_received, :deliver_later)
order.pay!
end
end
describe "ship event" do
context "when pending" do
it "raises error" do
expect { order.ship! }.to raise_error(AASM::InvalidTransition)
end
end
context "when processing" do
before { order.update!(status: :processing) }
it "transitions to shipped" do
expect { order.ship! }
.to change(order, :status).to("shipped")
end
end
end
end
高度なパターン
複数のステートマシン、永続化オプション、履歴の追跡については、以下を参照してください:
references/aasm-patterns.md
関連スキル
event-sourcing-coder- 状態遷移によって通知、Webhook、監査証跡を発生させる場合に、ドメインイベントを記録します。
コメント
Markdown 対応