Railsジェネレータ(rails generate)の使い方|モデル・scaffold・カスタム生成まで
Railsジェネレータは、rails generate(略記 rails g)でモデルやコントローラ、マイグレーションといった定型コードを自動生成するコマンドです。手で同じファイルを毎回書く代わりに、命名規則に沿った雛形をまとめて用意してくれるため、Railsアプリの立ち上げと機能追加が速くなります。この記事では、主要ジェネレータの使い方と生成物、全ジェネレータ共通のオプション、config.generatorsによる生成ファイルの制御、そして独自のカスタムジェネレータを作る方法までを、実行できるコマンド付きで整理します。本記事のコマンド挙動はRails 8.1.3(2026年3月リリース)時点に基づきます。Railsの開発環境がまだの場合はRuby on RailsをVSCodeで開発する環境構築を先に済ませてください。
まとめ:Railsジェネレータの要点
rails generateはThorを基盤にしたコード生成コマンドで、rails gと略記できる。model・controller・scaffold・migration などを命名規則どおりの雛形で生成する。- 引数なしで
rails generateを実行すると使えるジェネレータ一覧が、rails generate GENERATOR --helpで各ジェネレータのオプションが表示される。 - 生成を取り消すときは
rails destroy(略記rails d)。事前確認は--pretend(-p)でドライラン。 - テストやヘルパーなど不要なファイルは
config.generatorsの既定設定か、コマンドの--skip-*オプションで抑制する。 - 独自の生成処理は
Rails::Generators::NamedBaseを継承したカスタムジェネレータで作れる。
Railsジェネレータとは(rails generateの仕組み)
Railsジェネレータは、Railsの中核ライブラリ railties に含まれるコード生成の仕組みです。コマンドラインツール Thor の上に作られており、ジェネレータ内に定義したpublicメソッドが定義された順に実行され、その中でファイル作成・追記・ルーティング追加などの操作が行われます。これによって、モデルやコントローラのファイル配置・命名がプロジェクト全体で統一され、CRUDの初期コードを一から書く手間がなくなります。
たとえば User モデルを生成するには次のように実行します。
rails generate model User name:string email:string
このコマンドで、モデル本体・マイグレーション・テストなどが一度に作られます。生成物の具体は後述の各ジェネレータの節で扱います。
rails generate・rails g・rails destroy の関係
rails g は rails generate の別名で、動作は完全に同じです。長く打つのが面倒な場面では rails g を使えばよく、意味の違いはありません。対になるのが rails destroy(別名 rails d)で、直前に生成したファイル群をまとめて削除して生成を取り消すときに使います。生成コマンドを間違えたときは、同じ引数を destroy に渡すと元に戻せます。
# 生成
rails generate model User name:string email:string
# 生成を取り消す(同じ引数を destroy に渡す)
rails destroy model User
実行前に何が作られる(消される)かを確認したいときは --pretend(-p)を付けます。ファイルには一切触れず、生成予定のファイル一覧だけを表示するドライランになります。
使えるジェネレータ一覧と共通オプション
主要ジェネレータ一覧(rails generateで確認)
引数を付けずに rails generate を実行すると、そのアプリで使えるジェネレータの一覧が表示されます。gemを追加するとそのgem用のジェネレータもここに並びます。Rails標準の代表的なものは次のとおりです。
| ジェネレータ | コマンド例 | 主な生成物 |
|---|---|---|
| model | rails g model User |
モデル・マイグレーション・テスト |
| controller | rails g controller Articles index |
コントローラ・ビュー・ヘルパー・ルート追記 |
| scaffold | rails g scaffold Post title:string |
モデル一式+CRUDのコントローラ・ビュー |
| scaffold_controller | rails g scaffold_controller Post |
モデルは作らずCRUDのコントローラ・ビューのみ |
| resource | rails g resource Post title:string |
モデル・空コントローラ・resourcesルート |
| migration | rails g migration AddNameToUsers name:string |
マイグレーションファイル |
| mailer | rails g mailer UserMailer welcome |
メーラー・ビュー・テスト |
| job | rails g job cleanup |
Active Jobのジョブクラス・テスト |
| channel | rails g channel Chat |
Action Cableのチャネル・JS |
| generator | rails g generator initializer |
カスタムジェネレータの雛形 |
個別のジェネレータで指定できる引数やオプションは、rails generate GENERATOR --help で確認できます(例:rails generate model --help)。
全ジェネレータ共通のオプション
どのジェネレータでも使える共通オプションがあります。挙動を確認したいときや、既存ファイルの扱いを制御したいときに役立ちます。
| オプション | 短縮 | 意味 |
|---|---|---|
| –help | -h | そのジェネレータのオプションと使い方を表示 |
| –pretend | -p | ファイルを作らず、生成予定だけを表示(ドライラン) |
| –force | -f | 既存ファイルを確認なしで上書き |
| –skip | -s | 既に存在するファイルはスキップ |
| –quiet | -q | 生成ログの出力を抑制 |
これに加えて、後述する --skip-test-framework や --no-helper のような「特定の生成物を作らない」オプションがジェネレータごとに用意されています。
モデルの生成(rails generate model)
モデルは rails generate model モデル名 カラム名:型 で生成します。モデル名は単数形で指定するのが慣例です。
rails generate model Article title:string body:text published:boolean
このコマンドで生成される主なファイルは次のとおりです。
app/models/article.rb:モデルクラス(ApplicationRecordを継承)db/migrate/日時_create_articles.rb:articlesテーブルを作るマイグレーションtest/models/article_test.rbとtest/fixtures/articles.yml:テストとフィクスチャ
カラムの型には string text integer boolean datetime などが使えます。他モデルへの参照は references(または belongs_to)で指定でき、外部キー列とインデックスがマイグレーションに追加されます。
rails generate model Comment body:text article:references
生成後のモデルにバリデーションや関連(has_many など)を書き足していく流れになります。モデル同士の関連の定義はRailsのAssociationとは?、モデルとデータベースを結ぶ仕組みそのものはActive Recordとは?その基礎と重要性で詳しく扱っています。
コントローラの生成(rails generate controller)
コントローラは rails generate controller コントローラ名 アクション名... で生成します。モデルと違い、指定するのはカラムではなくアクション名である点に注意してください。コントローラ名は複数形が慣例です。
rails generate controller Articles index show new
このコマンドで生成・追記される主なものは次のとおりです。
app/controllers/articles_controller.rb:指定したアクションのメソッドを持つコントローラapp/views/articles/index.html.erbほか:アクションごとのビューapp/helpers/articles_helper.rb:ヘルパーconfig/routes.rbにget 'articles/index'などのルートを追記
ルートを自動追記したくない場合は --skip-routes を付けます。アクション名を省略して rails generate controller Articles とすれば、空のコントローラだけを作れます。
scaffoldによる一式生成(rails generate scaffold)
scaffoldは、モデル・マイグレーション・CRUD(一覧/詳細/作成/編集/削除)のコントローラとビュー・ルーティングをまとめて生成するジェネレータです。リソース名と属性を渡すだけで、すぐ動く管理画面のベースが手に入ります。
rails generate scaffold Post title:string content:text
| 生成物 | 役割 |
|---|---|
app/models/post.rb + マイグレーション |
モデルとテーブル定義 |
app/controllers/posts_controller.rb |
CRUD 7アクション |
app/views/posts/ 一式 |
index/show/new/edit/_form ビュー |
config/routes.rb に resources :posts |
RESTfulルート |
scaffoldを使うべき場面・避けたい場面
scaffoldは学習用やプロトタイプ、社内向けの単純な管理画面のように標準的なCRUDがそのまま使える場面で強力です。一方で、本番のドメインが複雑な機能にそのまま使うのは避けたほうがよい場面が多くあります。生成されるビューやコントローラは汎用的な雛形で、実際には多くを書き換え・削除することになり、使わないアクションやビューがそのまま残ると保守の負担になるためです。画面を持たないAPIサーバーなら --api を付けてビューを省く、モデルだけ・コントローラだけが欲しいなら rails g model や rails g controller を個別に使う、という判断が実務では有効です。
rails generate scaffold Post title:string content:text --api
APIモードでのフロントエンド連携の具体はRails APIとReactの連携方法で扱っています。
マイグレーションの生成(rails generate migration)
マイグレーションは、テーブルやカラムの追加・変更・削除をバージョン管理する仕組みです。rails generate migration マイグレーション名 で生成しますが、名前の付け方でマイグレーションの中身が自動で組み立てられる点がポイントです。
たとえば AddColumnToTable 形式の名前にすると、add_column を書いた change メソッドが生成されます。
rails generate migration AddPublishedToArticles published:boolean
class AddPublishedToArticles < ActiveRecord::Migration[8.1]
def change
add_column :articles, :published, :boolean
end
end
認識される代表的な命名パターンは次のとおりです。
| マイグレーション名 | 生成される処理 |
|---|---|
CreateArticles title:string |
create_table :articles |
AddXxxToArticles xxx:string |
add_column :articles, :xxx |
RemoveXxxFromArticles xxx:string |
remove_column :articles, :xxx |
生成したマイグレーションは rails db:migrate で適用し、直前の適用を取り消すときは rails db:rollback を使います。ActiveRecord::Migration[8.1] の角括弧はマイグレーションAPIのバージョンで、生成時のRailsのバージョンが自動で入ります。適用状況は rails db:migrate:status で確認できます。
生成ファイルの制御(config.generators)
「scaffoldでテストやヘルパー、CSSまで作られて邪魔」という悩みは、ジェネレータの設定側で解決します。Railsの生成挙動は config/application.rb の config.generators ブロックで既定を変えられます。
config.generatorsによる既定の変更
たとえばテストフレームワークをRSpecにし、ヘルパーとスタイルシートを生成しない設定は次のように書きます。
# config/application.rb
config.generators do |g|
g.test_framework :rspec
g.helper false
g.stylesheets false
g.jbuilder false
end
| 設定 | 制御対象 |
|---|---|
g.orm |
モデル/マイグレーションのORM(既定 :active_record) |
g.template_engine |
ビューのテンプレート(:erb など) |
g.test_framework |
テスト(:test_unit / :rspec) |
g.stylesheets / g.helper / g.jbuilder |
false で該当ファイルを生成しない |
コマンド単位での生成抑制
全体設定を変えずに、そのコマンドだけ一部の生成物を省くこともできます。--skip-test-framework(テストを作らない)や --no-helper のように、共通オプションの --skip-* / --no-* を付けます。
rails generate controller Articles index --skip-test-framework --no-helper
カスタムジェネレータの作成(Rails::Generators::NamedBase)
チーム独自の雛形(決まった構成のサービスクラスや初期化ファイルなど)を配りたいときは、自前のジェネレータを作れます。名前を引数に取るジェネレータは Rails::Generators::NamedBase を継承して作るのが基本です。
ジェネレータ雛形の生成(rails generate generator)
ジェネレータ自身もジェネレータで作れます。次のコマンドで lib/generators/ 以下に雛形が生成されます。
rails generate generator initializer
生成される主なファイルは、ジェネレータ本体 lib/generators/initializer/initializer_generator.rb、テンプレート置き場 lib/generators/initializer/templates/、使い方を書く USAGE です。
テンプレートとsource_root
実際にファイルを作るには、テンプレートの場所を source_root で指定し、copy_file や template でコピーします。ジェネレータ内では、引数の名前から file_name(スネークケース)や class_name(キャメルケース)といった変数が使えます。
# lib/generators/initializer/initializer_generator.rb
class InitializerGenerator < Rails::Generators::NamedBase
source_root File.expand_path("templates", __dir__)
def copy_initializer_file
template "initializer.rb.tt", "config/initializers/#{file_name}.rb"
end
end
拡張子 .tt のテンプレート内では <%= class_name %> のようにERBで変数を埋め込めます。
オプション追加とhook_forによる連携
コマンドラインの追加オプションは class_option で定義します。また、標準ジェネレータのように「モデルを作ったらテストも作る」といった他ジェネレータへの委譲は hook_for で実現します。
class InitializerGenerator < Rails::Generators::NamedBase
class_option :scope, type: :string, default: "app"
hook_for :test_framework
end
作ったジェネレータは rails generate initializer 名前 で呼び出せます。生成処理の共通化としてConcernのようにモジュールへ切り出す設計もありますが、乱用の判断はRailsのConcernはアンチパターンか?も参考になります。
よくある質問
Rails Generatorとは何ですか?
Railsジェネレータは、rails generate コマンドでモデルやコントローラ、マイグレーションなどの定型コードを自動生成する仕組みです。railtiesに含まれ、コマンドラインツールThorの上に作られています。命名規則に沿った雛形を用意することで、初期コードを書く手間を減らします。
rails g と rails generate に違いはありますか?
rails g は rails generate の別名で、動作はまったく同じです。同様に rails d は rails destroy の別名です。
生成したファイルを取り消すには?
生成に使った引数をそのまま rails destroy に渡します。たとえば rails generate model User を取り消すなら rails destroy model User です。実行前に対象を確認したいときは --pretend を付けてドライランします。
scaffoldと、controller・modelの個別生成はどちらを使うべきですか?
標準的なCRUDがそのまま使えるプロトタイプや単純な管理画面ならscaffoldが速いです。ドメインが複雑で不要なアクションやビューが多く残る場合や、画面を持たないAPIサーバーでは、rails g model と rails g controller を個別に使う(またはscaffoldに --api を付ける)ほうが無駄が出にくくなります。
テストやヘルパーなど不要なファイルを生成しない設定は?
config/application.rb の config.generators で g.helper false や g.test_framework :rspec のように既定を変えるか、コマンドに --no-helper や --skip-test-framework を付けて個別に抑制します。