mcpField
A
aasm-coder

aasm-coder

github.com/majesticlabs-dev開発5064 回インストール7 週間前に更新
リポジトリ

aasm-coder について

aasm-coder は、AASM でワークフローの状態を管理する方法を Rails 開発者向けに解説するスキルです。ガード、コールバック、エラー処理、テストを扱います。

主な機能

  1. 01AASM のステートマシンパターン
  2. 02ガード付き・複数の状態遷移
  3. 03状態とイベントのコールバック
  4. 04安全な失敗処理と例外処理
  5. 05RSpec によるステートマシンテスト

活用シーン

  1. 01Rails の注文ライフサイクルのモデル化
  2. 02ワークフロー遷移へのガード適用
  3. 03状態変更時のコールバック実行
  4. 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

コールバックの順序:

  1. before(イベント)
  2. before_exit(旧状態)
  3. before_enter(新状態)
  4. 状態変更を永続化
  5. after_exit(旧状態)
  6. after_enter(新状態)
  7. 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、監査証跡を発生させる場合に、ドメインイベントを記録します。

コメント