用途:在 Rails 8 项目中使用 Action Cable 与 WebSocket 实现实时功能,适用于实时更新、聊天、通知、实时看板、协作编辑等场景,避免轮询。
配置:Action Cable 默认包含在 Rails 中。在 config/cable.yml 配置适配器,开发环境用 async,测试环境用 test,生产环境可用 Rails 8 默认的 solid_cable,或使用 redis(url 取 REDIS_URL)。
结构:频道代码放在 app/channels,基类与连接认证放在 application_cable 下,前端订阅放在 app/javascript/channels,测试放在 spec/channels。
连接认证:在 ApplicationCable::Connection 中用 identified_by :current_user,connect 中根据签名 cookie 的 session_token 查找 Session 得到用户,失败时调用 reject_unauthorized_connection。
四种频道模式:通知频道按用户 stream_for current_user;资源更新频道针对特定资源流并做 reject 授权;聊天频道提供 speak、typing 等双向操作与在线状态;看板实时更新向账户成员广播统计与活动流。各模式统一采用 subscribed 查找资源、校验授权、stream_for,类级 broadcast_* 方法通过 ApplicationController.renderer 渲染局部模板,以及匹配的 JavaScript 订阅处理(received(data) 分支)。
广播:可在服务对象持久化后调用 EventsChannel.broadcast_update、在模型 after_create_commit 回调中触发、使用 Turbo Streams 的 broadcast_append_to / broadcast_remove_to,或用 Stimulus 控制器封装订阅生命周期。性能方面包含连接数限制、选择性广播与去抖广播。
测试:使用 stub_connection(current_user: user) 桩连接身份;subscribe 后断言 be_confirmed 与 have_stream_for;越权断言 be_rejected;用 have_broadcasted_to 校验广播载荷。
清单:连接认证、频道授权、客户端订阅、服务/模型广播、频道测试、错误处理、客户端重连逻辑、性能限制。
限制:资料未提供 gem 版本要求、兼容的 Rails 8 具体小版本、生产部署细节或性能基准数据。