mcpField
D
dhh-rails-style

dhh-rails-style

github.com/everyinc开发25.8k716 次安装今天更新
代码仓库

关于 dhh-rails-style

dhh-rails-style 是面向 Ruby 和 Rails 开发者的编码规范技能,提供基于 37signals/DHH 惯例的模型、控制器、前端与测试指导。它按任务类型读取对应参考资料,并可用于代码审查。

主要功能

  1. 01提供 Rails 架构与编码指导
  2. 02涵盖模型、控制器和前端模式
  3. 03指导 Minitest 与 fixtures 测试
  4. 04按任务读取对应参考文档
  5. 05依据规范审查代码

适用场景

  1. 01设计 Rails 控制器与资源路由
  2. 02整理模型状态与授权逻辑
  3. 03为 Rails 项目编写测试
  4. 04检查代码是否符合 DHH 风格

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/everyinc/compound-engineering-plugin --skill dhh-rails-style

安装后在 Claude Code 中输入/dhh-rails-style确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
architecture.md
controllers.md
frontend.md
gems.md
models.md
testing.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>
你正在处理什么?
  1. 控制器 - REST 映射、Concern、Turbo 响应、API 模式
  2. 模型 - Concern、状态记录、回调、作用域、PORO
  3. 视图与前端 - Turbo、Stimulus、CSS、partial
  4. 架构 - 路由、多租户、身份验证、任务、缓存
  5. 测试 - Minitest、fixtures、集成测试
  6. Gem 与依赖 - 应使用什么与应避免什么
  7. 代码审查 - 按 DHH 风格审查代码
  8. 一般指导 - 理念与约定

请指定编号或描述你的任务。

回复要阅读的参考资料
1,控制器references/controllers.md
2,模型references/models.md
3,视图、前端、turbo、stimulus、cssreferences/frontend.md
4,架构、路由、身份验证、任务、缓存references/architecture.md
5,测试、testing、minitest、fixturereferences/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、latest
  • preloaded(标准的预加载名称)
  • 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.mdREST 映射、concern、Turbo 响应、API 模式、HTTP 缓存
references/models.mdConcern、状态记录、回调、作用域、PORO、授权、广播
references/frontend.mdTurbo Streams、Stimulus 控制器、CSS 层、OKLCH 颜色、局部模板
references/architecture.md路由、身份验证、作业、Current 属性、缓存、数据库模式
references/testing.mdMinitest、固定数据、单元/集成/系统测试、测试模式
references/gems.md使用与避免的内容、决策框架、Gemfile 示例
</reference_index>

<success_criteria> 符合 DHH 风格的代码应满足以下条件:

  • 控制器将 CRUD 动词映射到资源
  • 模型使用 concern 实现横向行为
  • 状态通过记录跟踪,而非布尔值
  • 不使用不必要的服务对象或抽象
  • 优先采用数据库支持的方案,而非外部服务
  • 测试使用 Minitest 和固定数据
  • 使用 Turbo/Stimulus 实现交互功能(不使用重量级 JS 框架)
  • 使用具备现代特性的原生 CSS(层、OKLCH、嵌套)
  • 授权逻辑放在 User 模型中
  • 作业只是调用模型方法的浅层封装 </success_criteria>
基于 [Marc Köhlbrugge](https://x.com/marckohlbrugge) 撰写的 [The Unofficial 37signals/DHH Rails Style Guide](https://github.com/marckohlbrugge/unofficial-37signals-coding-style-guide),该指南通过对 Fizzy 代码库中 265 个拉取请求的深入分析生成。

重要免责声明:

  • 本指南由大模型生成,可能存在不准确之处
  • Fizzy 中的代码示例采用 O'Saasy License 授权
  • 本指南与 37signals 无关联,也未获其认可

评论

支持 Markdown