# dhh-rails-style > 当以 DHH 独特的 37signals 风格编写 Ruby 和 Rails 代码时,应该使用此技能。它适用于编写 Ruby 代码、Rails 应用程序、创建模型、控制器或任何 Ruby 文件。在 Ruby/Rails 代码生成、重构请求、代码审查或用户提及 DHH、37signals、Basecamp、HEY 或 Campfire 风格时触发。体现了 REST 纯度、胖模型、瘦控制器、当前属性、Hotwire 模式以及“清晰胜过聪明”的理念。 - Author: ZoneCNH - Repository: OpsFlux/compound-engineering-plugin - Version: 20260105065800 - Stars: 0 - Forks: 0 - Last Updated: 2026-02-07 - Source: https://github.com/OpsFlux/compound-engineering-plugin - Web: https://mule.run/skillshub/@@OpsFlux/compound-engineering-plugin~dhh-rails-style:20260105065800 --- --- name: dhh-rails-style description: 当以 DHH 独特的 37signals 风格编写 Ruby 和 Rails 代码时,应该使用此技能。它适用于编写 Ruby 代码、Rails 应用程序、创建模型、控制器或任何 Ruby 文件。在 Ruby/Rails 代码生成、重构请求、代码审查或用户提及 DHH、37signals、Basecamp、HEY 或 Campfire 风格时触发。体现了 REST 纯度、胖模型、瘦控制器、当前属性、Hotwire 模式以及“清晰胜过聪明”的理念。 --- 将 37signals/DHH Rails 约定应用于 Ruby 和 Rails 代码。此技能提供从分析生产 37signals 代码库(Fizzy/Campfire)中提取的领域专业知识。 ## 核心理念 “最好的代码是你不写的代码。第二好的代码是明显正确的代码。” **香草导轨足够了:** - 服务对象的丰富领域模型 - 自定义操作的 CRUD 控制器 - 对水平代码共享的担忧 - 记录为状态而不是布尔列 - 数据库支持的一切(无 Redis) - 在获取宝石之前构建解决方案 **他们刻意避免的:** - devise(自定义〜150行验证) - pundit/cancancan(模型中的简单角色检查) - sidekiq(Solid Queue 使用数据库) - redis(一切数据库) - view_component(部分工作正常) - GraphQL(REST 和 Turbo 就足够了) 你在做什么? 1. **控制器** - REST 映射、关注点、Turbo 响应 2. **模型** - 关注点、状态记录、回调、范围 3. **视图和前端** - Turbo、Stimulus、CSS、部分 4. **架构** - 路由、多租户、身份验证、作业 5. **代码审查** - 根据 DHH 风格审查代码 6. **一般指导** - 理念和惯例 **指定一个数字或描述您的任务。** |回应 |参考阅读| |----------|--------------------| | 1、“控制器”| [controllers.md](./references/controllers.md) | | 2、“型号”| [models.md](./references/models.md) | | 3、“视图”、“前端”、“涡轮”、“刺激”、“css”| [前端.md](./references/frontend.md) | | 4、“架构”、“路由”、“认证”、“作业”| [架构.md](./references/architecture.md) | | 5、“回顾”|阅读所有参考资料,然后查看代码 | | 6、一般任务|根据上下文阅读相关参考资料 | **阅读相关参考资料后,将模式应用到用户的代码中。** ## 命名约定 **动词:** `card.close`、`card.gild`、`board.publish`(不是 `set_style` 方法) **谓词:** `card.closed?`、`card.golden?`(源自相关记录的存在) **关注点:** 描述能力的形容词(`Closeable`、`Publishable`、`Watchable`) **控制器:** 名词匹配资源(`Cards::ClosuresController`) **范围:** - `chronologically`、`reverse_chronologically`、`alphabetically`、`latest` - `preloaded`(标准急切加载名称) - `indexed_by`、`sorted_by`(参数化) ## 休息映射 创建新资源而不是自定义操作: ``` POST /cards/:id/close → POST /cards/:id/closure DELETE /cards/:id/close → DELETE /cards/:id/closure POST /cards/:id/archive → POST /cards/:id/archival ``` ## 领域知识 `references/` 中的所有详细模式: |文件 |主题 | |------|--------| | [controllers.md](./references/controllers.md) | REST 映射、关注点、Turbo 响应、API 模式 | | [models.md](./references/models.md) |关注点、状态记录、回调、范围、PORO | | [前端.md](./references/frontend.md) | Turbo、Stimulus、CSS 架构、视图模式 | | [架构.md](./references/architecture.md) |路由、身份验证、作业、缓存、多租户、配置 | | [gems.md](./references/gems.md) |他们使用什么和避免什么,以及为什么 | 在以下情况下,代码遵循 DHH 风格: - 控制器映射到资源上的 CRUD 动词 - 模型使用对水平行为的关注 - 状态是通过记录而不是布尔值来跟踪的 - 没有不必要的服务对象或抽象 - 数据库支持的解决方案优于外部服务 - 测试使用 Minitest 和固定装置 - Turbo/Stimulus 交互性(无繁重的 JS 框架) 基于 [Marc Köhlbrugge](https://x.com/marckohlbrugge) 的 [非官方 37signals/DHH Rails 风格指南](https://gist.github.com/marckohlbrugge/d363fb90c89f71bd0c816d24d7642aca),通过对 Fizzy 代码库的深入分析而生成。