mcpField
R
rails-architecture

rails-architecture

github.com/thibautbaissac開発67174 回インストール21 週間前に更新
リポジトリ

rails-architecture について

Rails 8 開発者向けのアーキテクチャ指針です。各レイヤーの役割、抽象化の判断、テスト方針、新機能のチェック項目をまとめています。

主な機能

  1. 01レイヤーごとの責務
  2. 02抽象化の判断基準
  3. 03Rails 8 のパターン指針
  4. 04レイヤー別のテスト計画
  5. 05新機能のチェックリスト

活用シーン

  1. 01機能のコード階層を計画
  2. 02複雑なロジックの配置を決定
  3. 03各レイヤーのテストを設計
  4. 04コンポーネント抽出の要否を判断

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/thibautbaissac/rails_ai_agents --skill rails-architecture

インストール後、Claude Code で/rails-architectureを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
error-handling.md
layer-interactions.md
query-patterns.md
service-patterns.md
testing-strategy.md

詳細

モダンな Rails 8 アーキテクチャパターン

アーキテクチャの判断ツリー

Where should this code go?
|
+- View/display formatting?       -> Presenter (@presenter-agent)
+- Complex business logic?        -> Service Object (@service-agent)
+- Complex database query?        -> Query Object (@query-agent)
+- Shared behavior across models? -> Concern (/rails-concern skill)
+- Authorization logic?           -> Policy (@policy-agent)
+- Reusable UI with logic?        -> ViewComponent (@viewcomponent-agent)
+- Async/background work?         -> Job (@job-agent, /solid-queue-setup skill)
+- Complex form (multi-model)?    -> Form Object (@form-agent)
+- Transactional email?           -> Mailer (@mailer-agent)
+- Real-time/WebSocket?           -> Channel (/action-cable-patterns skill)
+- Data validation only?          -> Model (@model-agent)
+- HTTP request/response only?    -> Controller (@controller-agent)

レイヤーの責務

レイヤー責務含めるべきではないもの
ControllerHTTP、パラメーター、レスポンスビジネスロジック、クエリ
Modelデータ、バリデーション、関連付け表示ロジック、HTTP
Serviceビジネスロジック、オーケストレーションHTTP、表示ロジック
Query複雑なデータベースクエリビジネスロジック
Presenterビューのフォーマット、バッジビジネスロジック、クエリ
Policy認可ルールビジネスロジック
Component再利用可能な UI のカプセル化ビジネスロジック
Job非同期処理HTTP、表示ロジック
Form複雑なフォーム処理永続化ロジック
Mailerメールの作成ビジネスロジック
ChannelWebSocket 通信ビジネスロジック

抽象化しない場合

状況シンプルに保つ方法作成しないもの
シンプルな CRUD(10 行未満)コントローラーに記述するサービスオブジェクト
一度だけ使用するコードをインラインで記述する抽象化
条件が 1~2 個のシンプルなクエリモデルのスコープクエリオブジェクト
基本的なテキスト整形ヘルパーメソッドPresenter
単一モデルのフォームform_with model:フォームオブジェクト
ロジックのないシンプルなパーシャルパーシャルViewComponent

抽象化する場合

兆候対応
同じコードが 3 箇所以上にあるConcern/サービスに切り出す
コントローラーのアクションが 15 行を超えるサービスに切り出す
モデルが 300 行を超えるConcern に切り出す
条件分岐が複雑Policy/サービスに切り出す
クエリが 3 つ以上のテーブルを結合するクエリオブジェクトに切り出す
フォームが複数のモデルにまたがるフォームオブジェクトに切り出す

詳しい切り出し方針については、/extraction-timing スキルを参照してください。

コアパターン

スキニーコントローラー
# GOOD: Thin controller delegates to service
class OrdersController < ApplicationController
  def create
    result = Orders::CreateService.call(user: current_user, params: order_params)
    if result.success?
      redirect_to result.data, notice: t(".success")
    else
      flash.now[:alert] = result.error
      render :new, status: :unprocessable_entity
    end
  end
end
サービスの結果オブジェクト

すべてのサービスは、一貫した Result オブジェクトを返します。

Result = Data.define(:success, :data, :error) do
  def success? = success
  def failure? = !success
end
デフォルトでマルチテナント対応
# GOOD: Scoped through account
def index
  @events = current_account.events.recent
end

Rails 8 固有の機能

機能用途スキル/エージェント
認証has_secure_password ジェネレーター/authentication-flow
バックグラウンドジョブSolid Queue(データベース対応)/solid-queue-setup, @job-agent
リアルタイムAction Cable + Solid Cable/action-cable-patterns
キャッシュSolid Cache(データベース対応)/caching-strategies
アセットPropshaft + Import Maps(組み込み)
デプロイKamal 2 + Thruster(組み込み)

レイヤー別のテスト戦略

レイヤーテストタイプ注目点
Model単体バリデーション、スコープ、メソッド
Service単体ビジネスロジック、エッジケース
Query単体クエリ結果、テナント分離
Presenter単体フォーマット、HTML 出力
Controllerリクエスト統合、HTTP フロー
Componentコンポーネントレンダリング、バリアント
Policy単体認可ルール
SystemE2E重要なユーザーパス

新機能のチェックリスト

  1. Model - データ構造を定義する(@migration-agent、@model-agent)
  2. Policy - 認可ルールを追加する(@policy-agent)
  3. Service - ロジックが複雑な場合は作成する(@service-agent)
  4. Query - クエリが複雑な場合は追加する(@query-agent)
  5. Controller - 薄く保つ(@controller-agent)
  6. Presenter - 表示用にフォーマットする(@presenter-agent)
  7. Component - 再利用可能な UI を構築する(@viewcomponent-agent)
  8. Mailer - トランザクションメールを追加する(@mailer-agent)
  9. Job - バックグラウンド処理を追加する(@job-agent)

参考資料

  • レイヤー間の通信パターンについては、layer-interactions.md を参照してください
  • サービスオブジェクトのパターンについては、service-patterns.md を参照してください
  • クエリオブジェクトのパターンについては、query-patterns.md を参照してください
  • エラー処理の方針については、error-handling.md を参照してください
  • 包括的なテストについては、testing-strategy.md を参照してください

コメント