dhh-rails-style について
dhh-rails-styleは、37signals/DHHの慣習に基づき、Ruby・Rails開発者にモデル、コントローラー、フロントエンド、テストの指針を示すスキルです。タスクに応じた資料を参照し、コードレビューにも利用できます。
主な機能
- 01Railsの設計とコードスタイルの指針
- 02モデル、コントローラー、フロントエンドのパターン
- 03Minitestとfixturesのテスト指針
- 04タスクに応じたリファレンスの参照
- 05規約に基づくコードレビュー
活用シーン
- 01Railsコントローラーとリソースルートの設計
- 02モデルの状態管理と認可の整理
- 03Railsプロジェクトのテスト作成
- 04DHHスタイルに沿ったコードの確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ everyinc/ compound-engineering-plugin --skill dhh-rails-styleインストール後、Claude Code で/dhh-rails-styleを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/architecture.mdcontrollers.mdfrontend.mdgems.mdmodels.mdtesting.md詳細
<essential_principles>
基本理念
「最良のコードは、書かずに済むコードです。その次に良いのは、見ただけで正しいとわかるコードです。」
素の Rails で十分です:
- サービスオブジェクトより、ドメインを豊かに表現するモデル
- カスタムアクションより、CRUD コントローラー
- 横断的なコード共有には Concern
- 真偽値カラムではなく、状態を表すレコード
- すべてをデータベースで管理する(Redis は使いません)
- gem に頼る前に、まず解決策を自分で作る
意図的に避けるもの:
- devise(代わりに約 150 行の独自認証を実装)
- pundit/cancancan(モデル内のシンプルなロールチェック)
- sidekiq(Solid Queue はデータベースを使用)
- redis(あらゆる用途にデータベースを使用)
- view_component(パーシャルで十分)
- GraphQL(Turbo があれば REST で十分)
- factory_bot(フィクスチャのほうがシンプル)
- rspec(Minitest は Rails に同梱)
- Tailwind(レイヤーを使ったネイティブ CSS)
開発理念:
- リリース、検証、改善の順に進める――プロトタイプ品質のコードを本番環境に投入して学ぶ
- 症状ではなく、根本原因を修正する
- 読み取り時の計算より、書き込み時の処理を優先する
- ActiveRecord のバリデーションより、データベース制約を優先する </essential_principles>
- コントローラー - REST へのマッピング、Concern、Turbo のレスポンス、API のパターン
- モデル - Concern、状態レコード、コールバック、スコープ、PORO
- ビューとフロントエンド - Turbo、Stimulus、CSS、パーシャル
- アーキテクチャ - ルーティング、マルチテナント、認証、ジョブ、キャッシュ
- テスト - Minitest、フィクスチャ、結合テスト
- gem と依存関係 - 使うもの、避けるもの
- コードレビュー - DHH のスタイルに照らしたコードレビュー
- 全般的なガイダンス - 理念と規約
番号を指定するか、タスクを説明してください。
| 回答 | 参照するドキュメント |
|---|---|
| 1、コントローラー | references/controllers.md |
| 2、モデル | references/models.md |
| 3、ビュー、フロントエンド、Turbo、Stimulus、CSS | references/frontend.md |
| 4、アーキテクチャ、ルーティング、認証、ジョブ、キャッシュ | references/architecture.md |
| 5、テスト、テスト作成、Minitest、フィクスチャ | 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 フレームワークは使わない)
- レイヤー、OKLCH、ネスティングなどの最新機能を備えたネイティブ CSS を使っている
- 認可ロジックが User モデルにある
- ジョブはモデルのメソッドを呼び出す薄いラッパーである </success_criteria>
重要な免責事項:
- LLM が生成したガイドのため、不正確な内容が含まれる可能性があります
- Fizzy のコード例は O'Saasy License のライセンス対象です
- 37signals との提携や、同社による推奨を受けたものではありません