mcpField
D
dhh-rails-style

dhh-rails-style

github.com/everyinc開発25.8k716 回インストール今日更新
リポジトリ

dhh-rails-style について

dhh-rails-styleは、37signals/DHHの慣習に基づき、Ruby・Rails開発者にモデル、コントローラー、フロントエンド、テストの指針を示すスキルです。タスクに応じた資料を参照し、コードレビューにも利用できます。

主な機能

  1. 01Railsの設計とコードスタイルの指針
  2. 02モデル、コントローラー、フロントエンドのパターン
  3. 03Minitestとfixturesのテスト指針
  4. 04タスクに応じたリファレンスの参照
  5. 05規約に基づくコードレビュー

活用シーン

  1. 01Railsコントローラーとリソースルートの設計
  2. 02モデルの状態管理と認可の整理
  3. 03Railsプロジェクトのテスト作成
  4. 04DHHスタイルに沿ったコードの確認

インストール

コマンドをコピーしてターミナルで実行します。

$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

詳細

Ruby と Rails のコードに、37signals/DHH の Rails 規約を適用します。このスキルでは、37signals の本番コードベース(Fizzy/Campfire)と DHH のコードレビューのパターンを分析して得た、包括的なドメイン知識を提供します。

<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>
何に取り組んでいますか?
  1. コントローラー - REST へのマッピング、Concern、Turbo のレスポンス、API のパターン
  2. モデル - Concern、状態レコード、コールバック、スコープ、PORO
  3. ビューとフロントエンド - Turbo、Stimulus、CSS、パーシャル
  4. アーキテクチャ - ルーティング、マルチテナント、認証、ジョブ、キャッシュ
  5. テスト - Minitest、フィクスチャ、結合テスト
  6. gem と依存関係 - 使うもの、避けるもの
  7. コードレビュー - DHH のスタイルに照らしたコードレビュー
  8. 全般的なガイダンス - 理念と規約

番号を指定するか、タスクを説明してください。

回答参照するドキュメント
1、コントローラーreferences/controllers.md
2、モデルreferences/models.md
3、ビュー、フロントエンド、Turbo、Stimulus、CSSreferences/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、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 フレームワークは使わない)
  • レイヤー、OKLCH、ネスティングなどの最新機能を備えたネイティブ CSS を使っている
  • 認可ロジックが User モデルにある
  • ジョブはモデルのメソッドを呼び出す薄いラッパーである </success_criteria>
Fizzy のコードベースに対する 265 件のプルリクエストの詳細な分析を通じて作成された、[Marc Köhlbrugge](https://x.com/marckohlbrugge) による [The Unofficial 37signals/DHH Rails Style Guide](https://github.com/marckohlbrugge/unofficial-37signals-coding-style-guide) に基づいています。

重要な免責事項:

  • LLM が生成したガイドのため、不正確な内容が含まれる可能性があります
  • Fizzy のコード例は O'Saasy License のライセンス対象です
  • 37signals との提携や、同社による推奨を受けたものではありません

コメント