关于 ce-dhh-rails-style
为 Ruby 和 Rails 开发提供 37signals/DHH 风格指导的技能,包含控制器、模型、视图、架构、测试和依赖选择等主题。它强调简洁的 Rails 惯例、以记录表示状态,以及优先采用数据库方案。
主要功能
- 01控制器与 REST 资源映射指导
- 02模型、Concern 和状态记录模式
- 03Turbo、Stimulus 与原生 CSS 指导
- 04Minitest 和 fixtures 测试模式
- 05Gems 与依赖选择建议
- 06基于任务查找对应参考文档
适用场景
- 01按 CRUD 资源方式重构控制器
- 02将状态从布尔字段改为关联记录
- 03评审 Rails 模型与授权逻辑
- 04为 Rails 项目选择测试和依赖方案
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ everyinc/ compound-engineering-plugin --skill ce-dhh-rails-style安装后在 Claude Code 中输入/ce-dhh-rails-style确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/architecture.mdcontrollers.mdfrontend.mdgems.mdmodels.mdtesting.md详细介绍
将 37signals/DHH 的 Rails 约定应用于 Ruby 和 Rails 代码。此技能提供全面的领域知识,提炼自对 37signals 生产代码库(Fizzy/Campfire)和 DHH 代码审查模式的分析。
<essential_principles>
核心理念
“最好的代码,就是你不必写的代码。次好的代码,就是一眼就能看出正确无误的代码。”
原生 Rails 已绰绰有余:
- 优先使用丰富的领域模型,而非服务对象
- 优先使用 CRUD 控制器,而非自定义操作
- 使用 Concern 实现横向代码复用
- 用记录表示状态,而非布尔列
- 一切都由数据库支持(不用 Redis)
- 先自行构建解决方案,再考虑使用 gem
他们刻意避免的内容:
- devise(改用约 150 行的自定义身份验证代码)
- pundit/cancancan(在模型中进行简单的角色检查)
- sidekiq(Solid Queue 使用数据库)
- redis(一切都使用数据库)
- view_component(partial 已经够用)
- GraphQL(REST 配合 Turbo 已足够)
- factory_bot(fixtures 更简单)
- rspec(Rails 自带 Minitest)
- Tailwind(使用带层的原生 CSS)
开发理念:
- 发布、验证、改进——先将原型质量的代码投入生产,从中学习
- 修复根本原因,而非表面症状
- 优先在写入时操作,而非在读取时计算
- 优先使用数据库约束,而非 ActiveRecord 验证 </essential_principles>
- 控制器 - REST 映射、Concern、Turbo 响应、API 模式
- 模型 - Concern、状态记录、回调、作用域、PORO
- 视图与前端 - Turbo、Stimulus、CSS、partial
- 架构 - 路由、多租户、身份验证、任务、缓存
- 测试 - Minitest、fixtures、集成测试
- Gem 与依赖 - 应使用什么与应避免什么
- 代码审查 - 按 DHH 风格审查代码
- 一般指导 - 理念与约定
请指定编号或描述你的任务。
| 回复 | 要阅读的参考资料 |
|---|---|
| 1,控制器 | references/controllers.md |
| 2,模型 | references/models.md |
| 3,视图、前端、turbo、stimulus、css | references/frontend.md |
| 4,架构、路由、身份验证、任务、缓存 | references/architecture.md |
| 5,测试、testing、minitest、fixture | references/testing.md |
| 6,gem、依赖、库 | references/gems.md |
| 7,审查 | 阅读所有参考资料,然后审查代码 |
| 8,一般任务 | 根据上下文阅读相关参考资料 |
阅读相关参考资料后,将其中的模式应用于用户的代码。
<quick_reference>
命名约定
动词: card.close、card.gild、board.publish(不要使用 set_style 方法)
谓词: card.closed?、card.golden?(根据关联记录是否存在来判断)
Concern: 用描述能力的形容词命名(Closeable、Publishable、Watchable)
控制器: 使用与资源对应的名词(Cards::ClosuresController)
作用域:
chronologically、reverse_chronologically、alphabetically、latestpreloaded(标准的预加载名称)indexed_by、sorted_by(带参数)active、unassigned(业务术语,而非类似 SQL 的术语)
REST 映射
不要创建自定义操作,而要创建新资源:
POST /cards/:id/close → POST /cards/:id/closure
DELETE /cards/:id/close → DELETE /cards/:id/closure
POST /cards/:id/archive → POST /cards/:id/archival
Ruby 语法偏好
# Symbol arrays with spaces inside brackets
before_action :set_message, only: %i[ show edit update destroy ]
# Private method indentation
private
def set_message
@message = Message.find(params[:id])
end
# Expression-less case for conditionals
case
when params[:before].present?
messages.page_before(params[:before])
else
messages.last_page
end
# Bang methods for fail-fast
@message = Message.create!(params)
# Ternaries for simple conditionals
@room.direct? ? @room.users : @message.mentionees
关键模式
以记录表示状态:
Card.joins(:closure) # closed cards
Card.where.missing(:closure) # open cards
当前属性:
belongs_to :creator, default: -> { Current.user }
在模型中进行授权:
class User < ApplicationRecord
def can_administer?(message)
message.creator == self || admin?
end
end
</quick_reference>
<reference_index>
领域知识
所有详细模式见 references/:
| 文件 | 主题 |
|---|---|
references/controllers.md | REST 映射、concern、Turbo 响应、API 模式、HTTP 缓存 |
references/models.md | Concern、状态记录、回调、作用域、PORO、授权、广播 |
references/frontend.md | Turbo Streams、Stimulus 控制器、CSS 层、OKLCH 颜色、局部模板 |
references/architecture.md | 路由、身份验证、作业、Current 属性、缓存、数据库模式 |
references/testing.md | Minitest、固定数据、单元/集成/系统测试、测试模式 |
references/gems.md | 使用与避免的内容、决策框架、Gemfile 示例 |
| </reference_index> |
<success_criteria> 符合 DHH 风格的代码应满足以下条件:
- 控制器将 CRUD 动词映射到资源
- 模型使用 concern 实现横向行为
- 状态通过记录跟踪,而非布尔值
- 不使用不必要的服务对象或抽象
- 优先采用数据库支持的方案,而非外部服务
- 测试使用 Minitest 和固定数据
- 使用 Turbo/Stimulus 实现交互功能(不使用重量级 JS 框架)
- 使用具备现代特性的原生 CSS(层、OKLCH、嵌套)
- 授权逻辑放在 User 模型中
- 作业只是调用模型方法的浅层封装 </success_criteria>
重要免责声明:
- 本指南由大模型生成,可能存在不准确之处
- Fizzy 中的代码示例采用 O'Saasy License 授权
- 本指南与 37signals 无关联,也未获其认可
评论
支持 Markdown