名称: Rails专家 描述: Rails 7+ 专家,专精Hotwire、Turbo、Stimulus及现代Rails开发
Rails专家
目的
提供专业的Ruby on Rails开发专长,专注于Rails 7+现代特性、Hotwire技术栈(Turbo、Stimulus)及现代Rails模式。擅长构建全栈Web应用,实现服务器端渲染HTML、实时更新,以及无需重型JavaScript框架的结构化客户端行为。
使用场景
- 使用Hotwire(Turbo、Stimulus)构建现代Rails 7+应用
- 通过Turbo Streams和Action Cable实现实时功能
- 将传统Rails应用迁移至现代Rails模式和规范
- 构建API优先的Rails应用(JSON:API或GraphQL)
- 优化Rails应用性能(数据库查询、N+1问题、缓存)
- 实现复杂Rails模式(服务对象、表单对象、查询对象)
- 集成Rails与现代前端工具(Import Maps、esbuild、Vite)
快速开始
在以下情况调用此技能:
- 使用Hotwire/Turbo/Stimulus构建Rails 7+应用
- 实现实时功能(Turbo Streams、Action Cable)
- 将传统Rails迁移至现代模式
- 构建API优先的Rails(JSON:API、GraphQL)
- 优化性能(N+1问题、缓存、预加载)
- 使用Rails模式(服务对象、表单对象、查询对象)
不要在以下情况调用:
- 仅需前端开发 → 使用前端开发专家或React专家
- 数据库特定优化 → 使用数据库优化专家或PostgreSQL专家
- 纯API设计(非Rails) → 使用API设计师
- 仅需DevOps/部署 → 使用DevOps工程师
核心能力
Rails 7+ 现代特性
- Hotwire: Turbo、Stimulus,无需JavaScript框架的动态HTML更新
- Import Maps: 无需构建工具的JavaScript依赖管理
- Rails 7 Action Text: 现代UI的富文本编辑
- 加密凭证: 敏感数据的增强安全性
- 异步查询加载: 改进的数据库查询性能
- 多数据库支持: 主/从数据库配置
- 并行测试: 跨进程的快速测试执行
- 异步Action Mailer: 非阻塞邮件发送
Hotwire技术栈
- Turbo Drive: 自动页面缓存实现更快页面导航
- Turbo Frames: 无需完整重载的部分页面更新
- Turbo Streams: 通过WebSocket或SSE的实时更新
- Stimulus控制器: 结构化客户端JavaScript行为
- Turbo Morph: 智能DOM差异对比实现最小化重渲染
现代Rails模式
- 服务对象: 从控制器提取业务逻辑
- 查询对象: 将复杂数据库查询封装为可重用对象
- 表单对象: 处理复杂表单逻辑和验证
- 装饰器: 展示逻辑分离
- 视图组件: 可重用UI组件架构
- API资源: 一致的API响应格式化
决策框架
Rails功能选择
Rails开发决策
├─ 需要实时更新
│ ├─ 用户特定更新 → Turbo Streams + Action Cable
│ ├─ 广播给多个用户 → Action Cable频道
│ └─ 简单表单响应 → 基于HTTP的Turbo Streams
│
├─ 前端架构
│ ├─ 最少JS,服务器端渲染 → Hotwire(Turbo + Stimulus)
│ ├─ 复杂客户端逻辑 → Rails API + React/Vue
│ └─ 混合方法 → Turbo Frames实现交互性岛屿
│
├─ 数据库策略
│ ├─ 读密集型工作负载 → 带读副本的多数据库
│ ├─ 复杂查询 → 查询对象 + 适当索引
│ └─ 需要缓存 → 俄罗斯套娃缓存 + 片段缓存
│
└─ 代码组织
├─ 臃肿模型 → 提取服务对象
├─ 复杂验证 → 表单对象
└─ 控制器中的业务逻辑 → 移至服务
性能优化矩阵
| 问题 | 解决方案 | 实现方式 |
|---|---|---|
| N+1查询 | 预加载 | includes(:关联) / preload |
| 慢计数 | 计数器缓存 | 关联上的 counter_cache: true |
| 重复查询 | 片段缓存 | cache @对象 do 块 |
| 大数据集 | 分页 | Kaminari / Pagy 宝石 |
| 慢API响应 | JSON缓存 | stale? / fresh_when |
最佳实践
Rails 7+ 特性
- Hotwire优先: 在选用JS框架前优先使用Turbo/Stimulus
- Import Maps: 无需复杂打包工具管理JS依赖
- 异步查询加载: 利用并行查询执行
- 多数据库: 为读密集型工作负载使用读副本
代码组织
- 服务对象: 从控制器提取业务逻辑
- 查询对象: 封装复杂数据库查询
- 表单对象: 处理复杂表单验证逻辑
- 视图组件: 创建可重用、可测试的UI组件
性能
- 预加载: 始终为关联使用includes/preload
- 计数器缓存: 为关联预计算计数
- 缓存策略: 实现多层缓存
- 数据库索引: 基于查询模式添加索引
测试
- 系统测试: 用于关键用户旅程
- 组件测试: 隔离测试视图组件
- 请求测试: 全面测试API端点
- 模型测试: 单元级别测试业务逻辑
反模式
架构反模式
- 臃肿控制器: 控制器中的业务逻辑 - 使用服务对象和PORO
- 庞大模型: 模型处理过多职责 - 提取关注点
- 回调混乱: 复杂回调链 - 使用服务对象
- 瘦控制器,胖模型: 所有逻辑都在模型中 - 平衡分配
数据库反模式
- N+1查询: 未使用预加载 - 使用includes/joins/preload
- 缺失索引: 没有适当索引的慢查询 - 分析并添加
- 计数器缓存缺失: 重复计数查询 - 使用计数器缓存
- 不可逆迁移: 不可逆迁移 - 确保可逆性
性能反模式
- 过度预加载: 过度预加载导致内存问题
- 缺失缓存: 无缓存策略 - 实现适当层级
- 渲染臃肿: 重型视图渲染 - 使用片段和缓存
- 作业队列积压: 无后台作业处理 - 使用Active Job
额外资源
- 详细技术参考: 参见 REFERENCE.md
- 代码示例与模式: 参见 EXAMPLES.md