mcpField
G
generators

generators

github.com/thinkoodle開発7188 回インストール8 週間前に更新
リポジトリ

generators について

Rails 開発者やコーディングエージェント向けに、ジェネレーターの選択、設定、安全な実行方法をまとめたスキルです。必要なファイルだけを生成し、プロジェクトの既定値確認や変更のプレビュー、取り消しを重視します。

主な機能

  1. 01用途に合う最も具体的な組み込みジェネレーターの選択
  2. 02プロジェクトのジェネレーター設定の確認
  3. 03--pretend によるファイル変更のプレビュー
  4. 04bin/rails destroy による生成の取り消し
  5. 05カスタムジェネレーターとテンプレートの作成

活用シーン

  1. 01scaffold のファイルを作らずモデルを生成
  2. 02複数ファイルの scaffold を作成前に確認
  3. 03UUID と helper の生成既定値を設定
  4. 04再利用可能なプロジェクト専用ジェネレーターを作成

インストール

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

$npx skills add https://github.com/thinkoodle/rails-skills --skill generators

インストール後、Claude Code で/generatorsを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
built-in-generators.md
custom-generators.md
templates.md
testing.md
thor-actions.md

詳細

Rails ジェネレーターのエキスパート

適切なフラグを使って、適切なジェネレーターを実行します。必要なものだけを、過不足なく生成します。

基本方針

基本原則:

  1. 生成は最小限にする — モデルが必要ならscaffoldではなくmodelを使います。マイグレーションが必要ならmodelではなくmigrationを使います。
  2. 使わないものは省く — 明示的に必要な場合を除き、--no-helper、--no-assets、--no-jbuilderを指定します(またはconfig.generatorsでデフォルトを設定します)。
  3. ジェネレーターを把握する — Railsには30種類以上の組み込みジェネレーターがあります。手作業でコードを書く前に、それらを学びましょう。
  4. 最初にプロジェクトのデフォルト設定を確認する — 何かを実行する前に、config/application.rbでconfig.generatorsを確認します。
  5. 再生成する前に破棄する — 別のオプションで再実行する前に、bin/rails destroyを使ってジェネレーターの生成物をきれいに元に戻します。

このスキルを使う場面

  • bin/rails generateコマンドを実行するとき
  • タスクに適したジェネレーターを選ぶとき
  • config/application.rbでジェネレーターのデフォルトをカスタマイズするとき
  • プロジェクト固有のパターンに合わせたカスタムジェネレーターを作成するとき
  • 組み込みジェネレーターのテンプレートをオーバーライドするとき
  • ジェネレーターが作成するファイルを把握するとき

手順

ステップ1:プロジェクトのジェネレーター設定を確認する

最初に既存のジェネレーター設定を確認してください — プロジェクトでは、ヘルパーの生成を省略したり、UUIDを使用したり、その他のデフォルトを設定したりしている場合があります。

# Check for custom generator config
grep -A 20 "config.generators" config/application.rb

# See all available generators
bin/rails generate --help

# See specific generator options
bin/rails generate model --help

プロジェクトの規約に合わせます。プロジェクトでヘルパーの生成を無効にしていたり、UUIDを使っていたりする場合は、ジェネレーターでも同様に設定してください。

ステップ2:適切なジェネレーターを選ぶ

必要なことを実現する、最も具体的なジェネレーターを選びます。

必要なものジェネレーターではない
データベースのカラム変更migrationmodel
テーブルを伴う新しいモデルmodelscaffold
新しいコントローラーとビューcontrollerscaffold
CRUD一式のリソースscaffold—
API専用リソースscaffold --apiscaffold
バックグラウンドジョブjob手作業で作成
メーラーmailer手作業で作成
データベースのテーブル変更migration手作業で作成

ジェネレーターの階層(具体的なものから順):

migration → model → resource → scaffold
                  ↗
controller ------/

階層が上がるごとに、生成されるファイルが増えます。要件を満たす最も低い階層を必ず選んでください。

ステップ3:適切なフラグを使う

知っておくべき重要なフラグ:

# Skip unwanted files
--no-helper          # Skip helper file (almost always want this)
--no-assets          # Skip CSS/JS files
--no-jbuilder        # Skip JSON builder views
--no-test-framework  # Skip test files (if writing tests separately)
--no-fixture         # Skip fixture file only

# Control behavior
--skip-migration     # Generate model without migration
--skip-routes        # Don't add to routes.rb
--force              # Overwrite existing files
--pretend            # Dry run — show what would happen

# Field types
title:string         # Default type, can omit :string
body:text            # Long text
price:decimal        # Decimal number
published:boolean    # Boolean
published_at:datetime # Timestamp
user:references      # Foreign key + belongs_to
tags:jsonb           # JSON column (PostgreSQL)
ステップ4:最初に--pretendを付けて実行する

複数のファイルを作成するジェネレーターは、最初にドライランしてください — 後片付けをするよりも確認が簡単です。

# See what would be created without creating it
bin/rails generate scaffold Post title body:text --pretend

これにより、後で片付ける必要のある不要なファイルが生成されるのを防げます。

ステップ5:再生成する前に破棄する

間違えた場合は、最初に破棄してください。

# Undo a generator completely
bin/rails destroy model Post
bin/rails destroy scaffold Post
bin/rails destroy controller Posts

destroyは、generateが作成したものだけを削除します。ファイルを手動で削除しないでください。

ステップ6:デフォルトを設定する

プロジェクト全体のデフォルトをconfig/application.rbに設定します。

config.generators do |g|
  g.orm :active_record, primary_key_type: :uuid
  g.test_framework :test_unit, fixture: true
  g.helper false                    # Never generate helpers
  g.assets false                    # Never generate assets
  g.jbuilder false                  # Never generate jbuilder views
  g.system_tests :test_unit         # Or nil to skip
  g.template_engine :erb            # Or :slim, :haml
  g.stylesheets false               # Skip stylesheets
  g.javascripts false               # Skip JS files
end

一度設定すれば、コマンドごとに--no-helperなどを指定する必要はありません。

組み込みジェネレーター早見表

よく使うもの
ジェネレーター作成するもの例
modelモデル + マイグレーション + テスト + フィクスチャbin/rails g model Post title body:text
migrationマイグレーションファイルのみbin/rails g migration AddSlugToPosts slug:string:uniq
controllerコントローラー + ビュー + テスト + ルート + ヘルパーbin/rails g controller Posts index show
scaffoldモデル + コントローラー + ビュー + マイグレーション + テスト + ルートbin/rails g scaffold Post title body:text
resourceモデル + コントローラー(空)+ マイグレーション + ルートbin/rails g resource Post title body:text
その他の組み込みジェネレーター
ジェネレーター作成されるもの例
jobジョブクラスとテストbin/rails g job ProcessPayment
mailerメーラー、ビュー、テストbin/rails g mailer UserMailer welcome reset_password
channelAction Cable チャネルと JSbin/rails g channel Chat speak
taskRake タスクbin/rails g task feeds fetch
mailboxAction Mailbox メールボックスとテストbin/rails g mailbox Forwards
generatorカスタムジェネレーターのひな形bin/rails g generator my_generator
integration_test統合テストファイルbin/rails g integration_test UserFlows
system_testシステムテストファイルbin/rails g system_test UserFlows
scaffold_controllerコントローラーとビュー(モデル/マイグレーションなし)bin/rails g scaffold_controller Post title body:text
helperヘルパーモジュールとテストbin/rails g helper Posts
マイグレーション名の規則

Rails は名前からマイグレーションの動作を推測します。

# Add columns (AddXxxToYyy)
bin/rails g migration AddSlugToPosts slug:string:uniq

# Remove columns (RemoveXxxFromYyy)
bin/rails g migration RemoveBodyFromPosts body:text

# Create join table (CreateJoinTableXxxYyy)
bin/rails g migration CreateJoinTablePostsCategories posts categories

# Standalone (no inference — empty change method)
bin/rails g migration UpdatePostsSchema
フィールド型のリファレンス
# Common types
string        # VARCHAR (255 default)
text          # TEXT (unlimited)
integer       # INT
float         # FLOAT
decimal       # DECIMAL (use for money)
boolean       # BOOLEAN
date          # DATE
datetime      # DATETIME
timestamp     # TIMESTAMP
time          # TIME
binary        # BLOB

# Special types
references    # Foreign key (adds _id column + index + belongs_to)
belongs_to    # Alias for references
jsonb         # JSONB (PostgreSQL)
json          # JSON
uuid          # UUID
inet          # INET (PostgreSQL)
citext        # Case-insensitive text (PostgreSQL)

# Modifiers
title:string{100}        # String with limit
price:decimal{8,2}       # Precision and scale
slug:string:uniq         # Add unique index
slug:string:index        # Add index
user:references{polymorphic}  # Polymorphic association

カスタムジェネレーターの作成

作成するタイミング

プロジェクトに繰り返し使うパターンがある場合は、カスタムジェネレーターを作成します。

  • 一貫した構造を持つサービスオブジェクト
  • フォームオブジェクト
  • クエリーオブジェクト
  • ポリシークラス
  • デコレーター/プレゼンター
作成方法
bin/rails generate generator service

作成されるもの:

lib/generators/service/
├── service_generator.rb
├── USAGE
└── templates/
ジェネレーターの構成
# lib/generators/service/service_generator.rb
class ServiceGenerator < Rails::Generators::NamedBase
  source_root File.expand_path("templates", __dir__)

  # Optional: add arguments and options
  class_option :async, type: :boolean, default: false,
    desc: "Generate an async service with ActiveJob"

  def create_service_file
    template "service.rb.tt", "app/services/#{file_name}_service.rb"
  end

  def create_test_file
    template "service_test.rb.tt", "test/services/#{file_name}_service_test.rb"
  end

  private

  def async?
    options[:async]
  end
end
テンプレートファイル
# lib/generators/service/templates/service.rb.tt
class <%= class_name %>Service
  def initialize(<%= file_name %>)
    @<%= file_name %> = <%= file_name %>
  end

  def call
    # TODO: implement
  end

  private

  attr_reader :<%= file_name %>
end
使用可能なテンプレート変数
変数入力例結果
nameadmin/user_cleanupadmin/user_cleanup
file_nameadmin/user_cleanupuser_cleanup
class_nameadmin/user_cleanupAdmin::UserCleanup
human_nameadmin/user_cleanupAdmin user cleanup
plural_nameuserusers
singular_nameusersuser
table_nameuserusers
file_pathadmin/user_cleanupadmin/user_cleanup
class_pathadmin/user_cleanup["admin"]

組み込みテンプレートのオーバーライド

lib/templates/ にファイルを配置すると、組み込みジェネレーターのテンプレートをオーバーライドできます。

lib/templates/
├── erb/
│   └── scaffold/
│       ├── index.html.erb.tt
│       ├── show.html.erb.tt
│       ├── _form.html.erb.tt
│       └── _resource.html.erb.tt
├── rails/
│   └── scaffold_controller/
│       └── controller.rb.tt
└── active_record/
    └── migration/
        └── create_table_migration.rb.tt

Rails は独自のテンプレートより先に lib/templates/ を確認します。設定は不要です。

テンプレートのエスケープ: ERB を生成するジェネレーターテンプレートでは、二重のエスケープが必要です。

  • テンプレート内の <%%= → 出力内の <%=
  • テンプレート内の <%= → 生成時に評価

エージェントによくある間違い

  1. model で十分なのに scaffold を使う — scaffold はコントローラー、ビュー、ルート、ヘルパー、テストを作成します。モデルだけが必要なら model を使いましょう。後処理が減り、余計なファイルも少なくなります。

  2. --no-helper を忘れる — 現代の Rails ではヘルパーファイルはほとんど使われません。生成すると不要なファイルが増えるだけです。

  3. --pretend を省略する — 複雑なジェネレーターをドライランするのにかかる時間はわずかです。手作業で削除することになるファイルの生成を防げます。

  4. マイグレーションを手作業で書く — 命名規則(AddXxxToYyy、RemoveXxxFromYyy)に従って bin/rails g migration を実行すると、本文が自動生成されます。入力の手間を省きましょう。

  5. 生成後にファイルを手作業で削除する — 代わりに bin/rails destroy を使いましょう。ルートの追加を適切に元に戻し、生成されたファイルをすべて削除できます。

  6. scaffold_controller を知らない — モデルがあり、コントローラーとビューが必要な場合は scaffold_controller を使いましょう。scaffold を実行すると、モデルを再作成しようとします。

  7. プロジェクトのデフォルト設定を無視する — まず config.generators を確認しましょう。プロジェクトですでにヘルパーがスキップされる設定になっている場合、--no-helper は不要です。

  8. 一度限りの用途にカスタムジェネレーターを作成する — カスタムジェネレーターは、同じパターンを 3 回以上繰り返す場合に効果を発揮します。一度限りなら、ファイルをそのまま書きましょう。

パフォーマンスのヒント

  • --pretend は手間がかかりません — 生成前の確認に必ず使いましょう
  • フィールド定義をまとめる — bin/rails g model Post title body:text published:boolean は、マイグレーションを 1 つ生成します。3 つではありません
  • スキーマの変更には migration を使う — カラムを追加するために新しいモデルを生成しないでください

ジェネレーターの実行

# Standard
bin/rails generate model Post title body:text
bin/rails g model Post title body:text          # Short alias

# Dry run
bin/rails g model Post title --pretend

# Destroy (undo)
bin/rails destroy model Post
bin/rails d model Post                          # Short alias

# List all available
bin/rails generate --help

# Generator-specific help
bin/rails g model --help
bin/rails g migration --help
bin/rails g scaffold --help

ジェネレーターのデバッグ

# See what a generator would do
bin/rails g model Post --pretend

# Check generator resolution path
bin/rails g model --help | head -5

# Find where templates live
find lib/templates -name "*.tt" 2>/dev/null
find $(bundle show railties)/lib/rails/generators -name "*.tt" | head -20

# Check current generator config
grep -A 20 "config.generators" config/application.rb

詳細リファレンス

完全な例とエッジケースについては、references/ ディレクトリをご覧ください。

  • references/built-in-generators.md — すべての組み込みジェネレーターのフラグ、作成されるファイル、デフォルト設定のカスタマイズ
  • references/custom-generators.md — カスタムジェネレーターの作成、フック/合成、解決順序
  • references/templates.md — 組み込みテンプレートのオーバーライド、rails new 用のアプリケーションテンプレート
  • references/thor-actions.md — Thor のファイル操作メソッド(create_file、inject_into_file、gsub_file など)
  • references/testing.md — ジェネレーターのテスト、エッジケース(STI、UUID、名前空間)、レシピ、トラブルシューティング

コメント