generators について
Rails 開発者やコーディングエージェント向けに、ジェネレーターの選択、設定、安全な実行方法をまとめたスキルです。必要なファイルだけを生成し、プロジェクトの既定値確認や変更のプレビュー、取り消しを重視します。
主な機能
- 01用途に合う最も具体的な組み込みジェネレーターの選択
- 02プロジェクトのジェネレーター設定の確認
- 03--pretend によるファイル変更のプレビュー
- 04bin/rails destroy による生成の取り消し
- 05カスタムジェネレーターとテンプレートの作成
活用シーン
- 01scaffold のファイルを作らずモデルを生成
- 02複数ファイルの scaffold を作成前に確認
- 03UUID と helper の生成既定値を設定
- 04再利用可能なプロジェクト専用ジェネレーターを作成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ thinkoodle/ rails-skills --skill generatorsインストール後、Claude Code で/generatorsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/built-in-generators.mdcustom-generators.mdtemplates.mdtesting.mdthor-actions.md詳細
Rails ジェネレーターのエキスパート
適切なフラグを使って、適切なジェネレーターを実行します。必要なものだけを、過不足なく生成します。
基本方針
基本原則:
- 生成は最小限にする — モデルが必要なら
scaffoldではなくmodelを使います。マイグレーションが必要ならmodelではなくmigrationを使います。 - 使わないものは省く — 明示的に必要な場合を除き、
--no-helper、--no-assets、--no-jbuilderを指定します(またはconfig.generatorsでデフォルトを設定します)。 - ジェネレーターを把握する — Railsには30種類以上の組み込みジェネレーターがあります。手作業でコードを書く前に、それらを学びましょう。
- 最初にプロジェクトのデフォルト設定を確認する — 何かを実行する前に、
config/application.rbでconfig.generatorsを確認します。 - 再生成する前に破棄する — 別のオプションで再実行する前に、
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:適切なジェネレーターを選ぶ
必要なことを実現する、最も具体的なジェネレーターを選びます。
| 必要なもの | ジェネレーター | ではない |
|---|---|---|
| データベースのカラム変更 | migration | model |
| テーブルを伴う新しいモデル | model | scaffold |
| 新しいコントローラーとビュー | controller | scaffold |
| CRUD一式のリソース | scaffold | — |
| API専用リソース | scaffold --api | scaffold |
| バックグラウンドジョブ | 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 |
channel | Action Cable チャネルと JS | bin/rails g channel Chat speak |
task | Rake タスク | bin/rails g task feeds fetch |
mailbox | Action 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
使用可能なテンプレート変数
| 変数 | 入力例 | 結果 |
|---|---|---|
name | admin/user_cleanup | admin/user_cleanup |
file_name | admin/user_cleanup | user_cleanup |
class_name | admin/user_cleanup | Admin::UserCleanup |
human_name | admin/user_cleanup | Admin user cleanup |
plural_name | user | users |
singular_name | users | user |
table_name | user | users |
file_path | admin/user_cleanup | admin/user_cleanup |
class_path | admin/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 を生成するジェネレーターテンプレートでは、二重のエスケープが必要です。
- テンプレート内の
<%%=→ 出力内の<%= - テンプレート内の
<%=→ 生成時に評価
エージェントによくある間違い
-
modelで十分なのにscaffoldを使う — scaffold はコントローラー、ビュー、ルート、ヘルパー、テストを作成します。モデルだけが必要ならmodelを使いましょう。後処理が減り、余計なファイルも少なくなります。 -
--no-helperを忘れる — 現代の Rails ではヘルパーファイルはほとんど使われません。生成すると不要なファイルが増えるだけです。 -
--pretendを省略する — 複雑なジェネレーターをドライランするのにかかる時間はわずかです。手作業で削除することになるファイルの生成を防げます。 -
マイグレーションを手作業で書く — 命名規則(AddXxxToYyy、RemoveXxxFromYyy)に従って
bin/rails g migrationを実行すると、本文が自動生成されます。入力の手間を省きましょう。 -
生成後にファイルを手作業で削除する — 代わりに
bin/rails destroyを使いましょう。ルートの追加を適切に元に戻し、生成されたファイルをすべて削除できます。 -
scaffold_controllerを知らない — モデルがあり、コントローラーとビューが必要な場合はscaffold_controllerを使いましょう。scaffoldを実行すると、モデルを再作成しようとします。 -
プロジェクトのデフォルト設定を無視する — まず
config.generatorsを確認しましょう。プロジェクトですでにヘルパーがスキップされる設定になっている場合、--no-helperは不要です。 -
一度限りの用途にカスタムジェネレーターを作成する — カスタムジェネレーターは、同じパターンを 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、名前空間)、レシピ、トラブルシューティング