关于 37signals-rails
面向 Ruby on Rails 开发者的编码实践技能,整理 37signals 使用的约定。56 条规则涵盖架构、控制器、领域建模、基础设施、前端、风格与测试。
主要功能
- 018 个类别的 56 条规则
- 02架构与控制器约定
- 03领域与状态建模指南
- 04数据库与基础设施实践
- 05视图、代码风格与测试指南
适用场景
- 01编写 Rails 控制器、模型与视图
- 02选择 Rails 模式或 gem
- 03设计应用状态与数据库结构
- 04审查或重构 Rails 代码
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ pproenca/ dot-skills --skill 37signals-rails安装后在 Claude Code 中输入/37signals-rails确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
metadata.jsonassets/templates/_template.mdreferences/_sections.mdarch-avoid-patterns.mdarch-build-before-gems.mdarch-custom-auth.mdarch-domain-facades.mdarch-earn-abstractions.mdarch-rich-models.mdarch-ship-to-learn.mdarch-single-business-layer.mdarch-vanilla-rails.mdctrl-controller-concerns.mdctrl-crud-only.mdctrl-model-as-resources.mdctrl-nested-resources.mdctrl-params-expect.mdctrl-thin-controllers.mddb-backed-everything.mddb-multi-tenancy.mddb-no-foreign-keys.mddb-solid-cable.mddb-solid-cache.mddb-solid-queue.mddb-uuid-primary-keys.mdmodel-callbacks-auxiliary.mdmodel-concerns.mdmodel-counter-caches.mdmodel-delegated-type.mdmodel-event-tracking.md详细介绍
37signals Rails 最佳实践
全面介绍 Ruby on Rails 应用的编码原则和约定,反映了 37signals(Basecamp、HEY、Fizzy)的实践经验。包含 8 个类别的 56 条规则,并按架构影响排序。内容源自 37signals 的官方资料:Fizzy 代码库、STYLE.md、AGENTS.md、Rails Doctrine、DHH 的“On Writing Software Well”系列,以及非官方的 37signals 风格指南(265 个 Fizzy PR)。
何时应用
在以下情形中参考这些指南:
- 编写新的 Rails 控制器、模型或视图
- 决定使用 gem 还是原生 Rails
- 对状态和数据库架构进行建模
- 配置后台作业、缓存或实时功能
- 按照 37signals 风格的约定审查代码
- 重构以采用丰富的领域模型
- 选择身份验证或授权方案
- 添加 Stimulus 控制器或 Turbo 模式
按优先级划分的规则类别
| 优先级 | 类别 | 影响 | 前缀 |
|---|---|---|---|
| 1 | 架构基础 | CRITICAL | arch- |
| 2 | 控制器与 REST | CRITICAL | ctrl- |
| 3 | 领域建模 | HIGH | model- |
| 4 | 状态管理 | HIGH | state- |
| 5 | 数据库与基础设施 | HIGH | db- |
| 6 | 视图与前端 | MEDIUM | view- |
| 7 | 代码风格 | MEDIUM | style- |
| 8 | 测试 | MEDIUM | test- |
快速参考
1. 架构基础(CRITICAL)
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(CRITICAL)
ctrl-crud-only- 优先使用 CRUD 控制器,而非自定义操作ctrl-model-as-resources- 将非 CRUD 操作建模为独立资源ctrl-thin-controllers- 使用精简控制器和丰富的领域模型ctrl-params-expect- 使用 params.expect() 验证参数ctrl-controller-concerns- 使用控制器 Concern 处理横切行为ctrl-nested-resources- 使用 scope module 嵌套资源
3. 领域建模(HIGH)
model-concerns- 使用 Concern 在不同层面共享代码model-normalizes- 使用 normalizes 宏清理数据model-store-accessor- 使用 store_accessor 访问 JSON 列model-delegated-type- 使用 delegated_type 实现多态model-counter-caches- 使用计数器缓存避免 N+1 计数查询model-touch-chains- 使用 touch 链使缓存失效model-callbacks-auxiliary- 使用回调处理辅助复杂性model-event-tracking- 使用多态事件模型跟踪活动model-poro-namespacing- 在父模型下为 PORO 添加命名空间
4. 状态管理(HIGH)
state-records-over-booleans- 使用记录表示状态,而不是布尔列state-timestamps- 为状态转换添加时间戳state-enums- 使用枚举表示分类状态state-db-constraints- 使用数据库约束,而不是 ActiveRecord 验证state-write-time- 在写入时计算,而不是在读取时计算
5. 数据库与基础设施(HIGH)
db-backed-everything- 一切由数据库支持db-solid-queue- 使用 Solid Queue 处理后台任务db-solid-cable- 使用 Solid Cable 实现实时发布/订阅db-solid-cache- 使用 Solid Cache 实现应用缓存db-multi-tenancy- 使用 Current.account 实现基于路径的多租户db-uuid-primary-keys- 使用 UUID 作为主键db-no-foreign-keys- 不使用外键约束
6. 视图与前端(MEDIUM)
view-turbo-frames- 使用 Turbo Frames 实现页面片段范围限定view-turbo-streams- 使用 Turbo Streams 实现实时更新view-stimulus-targets- 使用 Stimulus Targets,而不是 CSS 选择器view-stimulus-design- Stimulus 控制器设计原则view-helpers-not-partials- 将逻辑提取到辅助方法中,而不是局部模板view-progressive-enhancement- 将渐进式增强作为主要模式view-fragment-caching- 使用片段缓存提升视图性能view-http-caching- 使用 fresh_when 和 ETags 实现 HTTP 缓存
7. 代码风格(MEDIUM)
style-conditionals- 使用展开的条件语句,而不是守卫子句style-method-ordering- 按调用顺序排列方法style-positive-names- 为方法和作用域使用肯定式名称style-naming-return-values- 方法名称应体现返回值style-visibility-modifiers- 可见性修饰符的格式style-bang-methods- 仅在存在非 bang 方法时使用 bang 方法style-async-naming- 异步操作使用 _later 和 _now 后缀
8. 测试(MEDIUM)
test-minitest- 使用 Minitest,而不是 RSpectest-fixtures- 使用数据库 fixtures,而不是 FactoryBottest-no-damage- 不要因测试而损害设计test-no-system-tests- 使用集成测试,而不是系统测试test-behavior- 测试行为,而不是实现
使用方法
阅读各个参考文件,了解详细说明和代码示例:
参考文件
| 文件 | 描述 |
|---|---|
| references/_sections.md | 类别定义和排序 |
| assets/templates/_template.md | 新规则模板 |
| metadata.json | 版本和参考信息 |
评论
支持 Markdown