action-cable-patterns について
Rails 8 開発者向けの Action Cable パターンガイドです。WebSocket によるリアルタイム更新、通知、双方向メッセージを扱い、チャンネル、ブロードキャスト、Stimulus 連携、テストの例を示します。
主な機能
- 01ユーザー通知・リソース更新チャンネル
- 02チャットメッセージとプレゼンス管理
- 03アカウントメンバーへのダッシュボード配信
- 04サービス・モデル・コールバックからの配信
- 05チャンネルと認可のテスト
活用シーン
- 01ユーザーへの通知配信
- 02プレゼンス付きチャットの構築
- 03ダッシュボードでのリアルタイム表示
- 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.mdchannel-patterns.mdtesting.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:ダッシュボードのライブ更新 — アカウントのすべてのメンバーに統計情報とアクティビティフィードをブロードキャストします
各パターンは同じ構成に従います。
subscribed— リソースを検索し、認可を確認して、stream_forを呼び出します- クラスレベルの
broadcast_*メソッド —ApplicationController.rendererを介してパーシャルをレンダリングします 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 のチャネルスペック、認可スペック、システムテスト
コメント
Markdown 対応