name: 37信号Rails description: 来自DHH、Jorge Manrubia和Fizzy/Basecamp/HEY代码库的37信号Rails编码原则和惯例。此技能应用于遵循37信号理念编写、审查或重构Ruby on Rails代码时 — 香草Rails、CRUD控制器、丰富的域模型、concerns、无服务对象、Hotwire、Turbo、Stimulus、Solid队列、Solid缓存、Solid电缆、多租户、Minitest、自定义认证或DHH惯例。
37信号Rails最佳实践
针对Ruby on Rails应用程序的综合编码原则和惯例,基于37signals(Basecamp、HEY、Fizzy)的实践经验。包含8个类别的56条规则,按架构影响优先排序。源自官方37signals来源:Fizzy代码库、STYLE.md、AGENTS.md、Rails信条、DHH的《论软件编写良好》系列和非官方37信号风格指南(265个Fizzy PR)。
何时应用
参考这些指南当:
- 编写新的Rails控制器、模型或视图
- 决定使用gem还是香草Rails
- 建模状态和数据库模式
- 设置后台作业、缓存或实时功能
- 审查代码是否符合37信号风格惯例
- 重构以采用丰富的域模型
- 选择认证或授权方法
- 添加Stimulus控制器或Turbo模式
按优先级分类的规则类别
| 优先级 | 类别 | 影响 | 前缀 |
|---|---|---|---|
| 1 | 架构基础 | 关键 | arch- |
| 2 | 控制器与REST | 关键 | ctrl- |
| 3 | 域建模 | 高 | model- |
| 4 | 状态管理 | 高 | state- |
| 5 | 数据库与基础设施 | 高 | db- |
| 6 | 视图与前端 | 中 | view- |
| 7 | 代码风格 | 中 | style- |
| 8 | 测试 | 中 | test- |
快速参考
1. 架构基础(关键)
arch-rich-models- 丰富的域模型优于服务对象arch-vanilla-rails- 香草Rails足够arch-avoid-patterns- 刻意避免的模式和gemarch-earn-abstractions- 通过规则三赚取抽象arch-build-before-gems- 在寻找gem之前自己构建arch-ship-to-learn- 从简单开始 — 仅在验证后增加复杂性arch-domain-facades- 域模型作为内部复杂性的门面arch-single-business-layer- 单一业务逻辑层arch-custom-auth- 自定义无密码认证优于Devise
2. 控制器与REST(关键)
ctrl-crud-only- CRUD控制器优于自定义操作ctrl-model-as-resources- 将非CRUD操作建模为单独资源ctrl-thin-controllers- 薄控制器与丰富域模型ctrl-params-expect- 使用params.expect()进行参数验证ctrl-controller-concerns- 控制器concerns用于横切行为ctrl-nested-resources- 嵌套资源使用scope module
3. 域建模(高)
model-concerns- 用于水平代码共享的concernsmodel-normalizes- 使用normalizes宏进行数据清理model-store-accessor- 使用store_accessor访问JSON列model-delegated-type- 使用delegated_type实现多态性model-counter-caches- 计数器缓存以避免N+1计数查询model-touch-chains- 触摸链用于缓存失效model-callbacks-auxiliary- 回调用于辅助复杂性model-event-tracking- 多态事件模型用于活动跟踪model-poro-namespacing- 在父模型下命名空间PORO
4. 状态管理(高)
state-records-over-booleans- 使用记录作为状态而非布尔列state-timestamps- 时间戳用于状态转换state-enums- 枚举用于分类状态state-db-constraints- 数据库约束优于ActiveRecord验证state-write-time- 在写入时而非读取时计算
5. 数据库与基础设施(高)
db-backed-everything- 数据库支持一切db-solid-queue- Solid队列用于后台作业db-solid-cable- Solid电缆用于实时发布/订阅db-solid-cache- Solid缓存用于应用缓存db-multi-tenancy- 基于路径的多租户使用Current.accountdb-uuid-primary-keys- UUID作为主键db-no-foreign-keys- 无外键约束
6. 视图与前端(中)
view-turbo-frames- 使用Turbo框架处理页面片段view-turbo-streams- 使用Turbo流处理实时更新view-stimulus-targets- 使用Stimulus目标而非CSS选择器view-stimulus-design- Stimulus控制器设计原则view-helpers-not-partials- 将逻辑提取到helper而非partialview-progressive-enhancement- 渐进增强作为主要模式view-fragment-caching- 片段缓存用于视图性能view-http-caching- 使用fresh_when和ETags的HTTP缓存
7. 代码风格(中)
style-conditionals- 展开条件句优于守卫从句style-method-ordering- 方法按调用顺序排序style-positive-names- 使用积极名称命名方法和范围style-naming-return-values- 方法名称反映返回值style-visibility-modifiers- 可见性修饰符格式化style-bang-methods- 感叹号方法仅当非感叹号方法存在时使用style-async-naming- 使用_later和_now后缀命名异步操作
8. 测试(中)
test-minitest- 使用Minitest而非RSpectest-fixtures- 使用数据库fixtures而非FactoryBottest-no-damage- 无测试诱导的设计损害test-no-system-tests- 集成测试优于系统测试test-behavior- 测试行为而非实现
如何使用
阅读单独的参考文件获取详细解释和代码示例:
参考文件
| 文件 | 描述 |
|---|---|
| references/_sections.md | 类别定义和排序 |
| assets/templates/_template.md | 新规则的模板 |
| metadata.json | 版本和参考信息 |