mcpField
A
action-cable-patterns

action-cable-patterns

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

action-cable-patterns について

Rails 8 開発者向けの Action Cable パターンガイドです。WebSocket によるリアルタイム更新、通知、双方向メッセージを扱い、チャンネル、ブロードキャスト、Stimulus 連携、テストの例を示します。

主な機能

  1. 01ユーザー通知・リソース更新チャンネル
  2. 02チャットメッセージとプレゼンス管理
  3. 03アカウントメンバーへのダッシュボード配信
  4. 04サービス・モデル・コールバックからの配信
  5. 05チャンネルと認可のテスト

活用シーン

  1. 01ユーザーへの通知配信
  2. 02プレゼンス付きチャットの構築
  3. 03ダッシュボードでのリアルタイム表示
  4. 04チャンネル購読とリソース認可のテスト

インストール

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

$npx skills add https://github.com/thibautbaissac/rails_ai_agents --skill action-cable-patterns

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

同梱ファイル

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

references/
broadcasting-and-stimulus.md
channel-patterns.md
testing.md

詳細

Rails 8 向け Action Cable パターン

概要

Action Cable は WebSocket を Rails に統合します。

  • ポーリングなしでリアルタイムに更新
  • サーバーからクライアントへのプッシュ通知
  • チャットおよびメッセージ機能
  • ライブダッシュボードおよびフィード
  • 共同編集

クイックスタート

Action Cable はデフォルトで Rails に含まれています。次のように設定します。

# config/cable.yml
development:
  adapter: async

test:
  adapter: test

production:
  adapter: solid_cable  # Rails 8 default
  # OR
  adapter: redis
  url: <%= ENV.fetch("REDIS_URL") %>

プロジェクト構成

app/
├── channels/
│   ├── application_cable/
│   │   ├── connection.rb      # Authentication
│   │   └── channel.rb         # Base channel
│   ├── notifications_channel.rb
│   ├── events_channel.rb
│   └── chat_channel.rb
├── javascript/
│   └── channels/
│       ├── consumer.js
│       ├── notifications_channel.js
│       └── events_channel.js
spec/channels/
├── notifications_channel_spec.rb
└── events_channel_spec.rb

接続認証

# app/channels/application_cable/connection.rb
module ApplicationCable
  class Connection < ActionCable::Connection::Base
    identified_by :current_user

    def connect
      self.current_user = find_verified_user
    end

    private

    def find_verified_user
      # Using Rails 8 authentication
      if session_token = cookies.signed[:session_token]
        if session = Session.find_by(token: session_token)
          session.user
        else
          reject_unauthorized_connection
        end
      else
        reject_unauthorized_connection
      end
    end
  end
end

チャネルのパターン

4 つの基本パターンを利用できます。Ruby と JavaScript の実装全文は、channel-patterns.md を参照してください。

  • パターン 1:通知チャネル — stream_for current_user を介してユーザーごとの通知をストリーミングします
  • パターン 2:リソース更新チャネル — reject による認可を行い、特定のリソースの更新をストリーミングします
  • パターン 3:チャットチャネル — speak と typing アクションによる双方向メッセージングと、プレゼンスの追跡を行います
  • パターン 4:ダッシュボードのライブ更新 — アカウントのすべてのメンバーに統計情報とアクティビティフィードをブロードキャストします

各パターンは同じ構成に従います。

  1. subscribed — リソースを検索し、認可を確認して、stream_for を呼び出します
  2. クラスレベルの broadcast_* メソッド — ApplicationController.renderer を介してパーシャルをレンダリングします
  3. received(data) の switch を含む、対応する JavaScript サブスクリプションハンドラー

ブロードキャスト

ブロードキャストはサービス、モデル、またはコールバックから実行できます。詳しくは broadcasting-and-stimulus.md を参照してください。

  • サービスオブジェクトから — 永続化の後に EventsChannel.broadcast_update(event) を呼び出します
  • モデルコールバックから — after_create_commit を使ってチャネルのブロードキャストを実行します
  • Turbo Streams の統合 — モデル上で broadcast_append_to / broadcast_remove_to ヘルパーを直接使います
  • Stimulus コントローラー — Action Cable のサブスクリプションのライフサイクルを Stimulus コントローラー内にまとめ、接続/切断を適切に管理します
  • パフォーマンスのパターン — 接続数の上限、選択的なブロードキャスト、ブロードキャストのデバウンス

チャネルのテスト

仕様の全文は testing.md を参照してください。主な規約は次のとおりです。

# Stub connection identity
stub_connection(current_user: user)

# Assert subscription confirmed and streaming
subscribe(event_id: event.id)
expect(subscription).to be_confirmed
expect(subscription).to have_stream_for(event)

# Assert rejection for unauthorized access
expect(subscription).to be_rejected

# Assert broadcast payload
expect {
  described_class.notify(user, notification)
}.to have_broadcasted_to(user).with(hash_including(type: "notification"))

チェックリスト

  • 接続認証を設定済み
  • チャネル認可を実装済み
  • クライアント側のサブスクリプションを設定済み
  • サービス/モデルからのブロードキャストを設定済み
  • チャネルのスペックを作成済み
  • エラー処理を実装済み
  • クライアント側の再接続ロジックを実装済み
  • パフォーマンスの上限を設定済み

参考資料

  • channel-patterns.md — 通知、リソース更新、チャット、ダッシュボードの各チャネルの実装全文(Ruby + JavaScript)
  • broadcasting-and-stimulus.md — サービス/モデルからのブロードキャスト、Turbo Streams の統合、Stimulus コントローラー、パフォーマンスのヒント
  • testing.md — RSpec のチャネルスペック、認可スペック、システムテスト

コメント