SuperAPI AI 工具集

dhh-rails-style

编程与开发

查看项目

更新于 10-14 15:42

技能介绍

用途

dhh-rails-style 是一个供 AI 编码助手使用的技能,用于在编写 Ruby 与 Rails 代码时套用 DHH(37signals 风格)。它适用于撰写 Ruby 代码、开发 Rails 应用,或按该风格评审代码的场景。技能内部声明,其作用是在完成任务前读取相应参考文件,再把其中的模式应用到用户的代码上。

核心哲学

资料给出的核心主张是:「最好的代码是你没写的代码,其次是一看就正确的代码。」其立场是「原味 Rails 就够了」,包括:

  • 用丰富的领域模型代替服务对象
  • 用 CRUD 控制器代替自定义动作
  • 用 concerns 做横向代码共享
  • 用记录表达状态,而不是布尔字段
  • 一切尽量由数据库支撑(不用 Redis)
  • 先自建解决方案,再考虑引入 gem

开发哲学包括:先发布、再验证、后改进(把原型级代码推到生产以获取认知);修复根因而非症状;写时操作优于读时计算;数据库约束优于 ActiveRecord 校验。

刻意规避的做法

资料明确列出该风格尽量不使用的依赖与方案:devise(改用约 150 行的自建认证)、pundit/cancancan(在模型里做简单角色判断)、sidekiq(Solid Queue 使用数据库)、redis(全部用数据库)、view_component(partials 足够)、GraphQL(REST 配 Turbo 足够)、factory_bot(fixtures 更简单)、rspec(Minitest 随 Rails 提供)、Tailwind(使用带 layers 的原生 CSS)。

主要能力与内容结构

技能按主题提供参考文件,用户可指定编号或描述任务,助手据此读取对应资料:

  1. 控制器 → references/controllers.md(REST 映射、concerns、Turbo 响应、API 模式、HTTP 缓存)
  2. 模型 → references/models.md(concerns、状态记录、回调、scope、PORO、授权、广播)
  3. 视图与前端 → references/frontend.md(Turbo Streams、Stimulus 控制器、CSS layers、OKLCH 颜色、partials)
  4. 架构 → references/architecture.md(路由、认证、任务、Current 属性、缓存、数据库模式)
  5. 测试 → references/testing.md(Minitest、fixtures、单元/集成/系统测试与测试模式)
  6. Gems 与依赖 → references/gems.md(用什么、避什么、决策框架、Gemfile 示例)
  7. 代码评审 → 读取全部参考资料后评审代码
  8. 通用任务 → 按上下文读取相关参考

快速参考要点

命名约定方面:动词形式如 card.close、card.gild、board.publish(而非 set_style 之类方法);谓词形式如 card.closed?、card.golden?(由关联记录是否存在推导);concerns 用描述能力的形容词(Closeable、Publishable、Watchable);控制器用与资源匹配的名词(Cards::ClosuresController)。Scope 命名包括 chronologically、reverse_chronologically、alphabetically、latest、preloaded、indexed_by、sorted_by,以及使用业务术语而非 SQL 风格的 active、unassigned。

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 语法偏好(资料中的示例原样保留):符号数组括号内留空格 before_action :set_message, only: %i[ show edit update destroy ];私有方法缩进 private 后方法体多一级缩进;无表达式 case 用于条件分支(case / when params[:before].present?);快速失败用 bang 方法 @message = Message.create!(params);简单条件用三元表达式。

关键模式方面:以记录表示状态,如 Card.joins(:closure) 取已关闭卡片、Card.where.missing(:closure) 取未关闭卡片;Current 属性如 belongs_to :creator, default: -> { Current.user };授权逻辑放在模型上,例如在 User 中定义 can_administer?(message) 判断创建者或管理员。

判定标准

资料给出代码符合该风格的成功标准:控制器映射到资源上的 CRUD 动词;模型用 concerns 处理横向行为;状态由记录而非布尔值跟踪;没有不必要的服务对象或抽象;优先数据库支撑方案而非外部服务;测试用 Minitest 加 fixtures;用 Turbo/Stimulus 实现交互(不用重型 JS 框架);使用含现代特性的原生 CSS(layers、OKLCH、嵌套);授权逻辑位于 User 模型;后台任务只是调用模型方法的浅层包装。

限制与声明

资料明确声明:该指南由 LLM 生成,可能包含不准确之处;其中的代码示例来自 Fizzy,采用 O'Saasy License 授权;本技能与 37signals 无隶属关系,也未获其背书。关于具体安装方式、使用命令、收费与价格、运行平台等信息,资料暂未提供。