---
title: "Railsジェネレータ（rails generate）の使い方｜生成ファイル一覧と取り消し・カスタム生成【Rails 8.1.4】"
url: "https://www.issoh.co.jp/tech/details/2874/"
published: 2024-07-02
updated: 2026-10-27
categories: ["Ruby on Rails"]
publisher: "株式会社一創"
---

# Railsジェネレータ（rails generate）の使い方｜生成ファイル一覧と取り消し・カスタム生成【Rails 8.1.4】

`rails generate`（略記 `rails g`）は、モデル・コントローラ・マイグレーションなどの雛形を命名規則どおりに作るコマンドです。この記事では、各ジェネレータが何を作るかを**Rails 8.1.4（2026年9月24日リリース）を実際に実行したログ**で一覧にし、カラムの書き方、`rails destroy`で取り消すときに残るもの、生成ファイルを減らす設定、独自ジェネレータの作り方までを扱います。検証はRuby 4.0.6・`rails new`の既定構成（SQLite・Minitest）で行いました。開発環境がまだの場合は[ruby on rails を vscode で開発する環境構築【2026年版】Ruby LSP・デバッグ・Dev Container](/tech/details/2878/)から始めてください。

## まとめ：rails generateの要点（Rails 8.1.4）

- `rails g`は`rails generate`、`rails d`は`rails destroy`の別名です。引数なしの`bin/rails generate`で一覧が出ます（Railsグループは20種類）。
- modelはモデル・マイグレーション・テスト・フィクスチャ、controllerはコントローラ・アクションごとのビュー・ルート・ヘルパー・テストを作ります。scaffoldはその両方に加えてCRUDのビューとJSON用jbuilderまで作ります。
- Rails 8.1からscaffoldはシステムテストを作りません。必要なら`--system-tests=true`を付けます。
- カラムは`名前:型{長さ}:index`の形で書き、`!`（Rails 8.0以降）で`null: false`になります。`decimal{10,2}`はシェルが展開してしまうので引用符で囲みます。
- `rails destroy`は生成ファイルの削除や対応するルートの除去を行いますが、適用済みのマイグレーションは戻しません。`db:migrate`済みならテーブルが残るので、先に`db:rollback`します。controllerはアクション名まで渡さないとルートが残ります。
- 不要な生成物は`config.generators`か`--no-helper`などのオプションで止め、独自の雛形は`rails g generator`か`lib/templates`で作ります。

## rails generateの基本と一覧の出し方

### rails g・rails destroy・–pretendの関係

`rails g`と`rails generate`に動作の違いはありません。取り消しは同じ引数を`rails destroy`（`rails d`）に渡します。何が作られるかだけ見たいときは`-p`（`--pretend`）を付けると、ログは通常どおり出ますがファイルは作られません。実際に`bin/rails g model Draft --pretend title:string`を実行したあと`db/migrate`を確認しても、draftsのマイグレーションはありませんでした。

```
bin/rails g model Article title:string -p   # 生成予定だけ表示
bin/rails g model Article title:string      # 生成
bin/rails d model Article                   # 取り消し
bin/rails g model --help                    # modelジェネレータのオプション一覧
```

アプリのディレクトリ内では`bin/rails`を使うと、そのアプリのGemfileに書かれた版のRailsで動きます。共通オプションは`-p`のほか、既存ファイルを上書きする`-f`（`--force`）、既存ファイルを飛ばす`-s`（`--skip`）、ログを出さない`-q`（`--quiet`）です。

### Rails 8.1.4で使えるジェネレータ（20種類）

`rails new`直後のアプリで`bin/rails generate`を引数なしで実行すると、「Rails:」の下に次の20種類が並びました。

```
application_record  authentication  benchmark  channel  controller
generator  helper  integration_test  jbuilder  job  mailbox  mailer
migration  model  resource  scaffold  scaffold_controller  script
system_test  task
```

その下には`solid_queue:install`や`stimulus`など、Gemfileに入っているgemが登録したジェネレータが別のグループで続きます。**`view`という単独のジェネレータは無く**、`bin/rails g view Foo`は「Could not find generator ‘view’.」で終了コード1になります。ビューはcontrollerかscaffoldが作ります。

Rails 8.0で増えたのが`authentication`と`script`です（[railties 8.0のCHANGELOG](https://github.com/rails/rails/blob/8-0-stable/railties/CHANGELOG.md)）。`authentication`はセッション・パスワードリセットのコントローラとモデル、`email_address:string!:uniq`を持つusersテーブルのマイグレーションを作り、Gemfileのbcryptのコメントを外して`bundle install`まで実行します。既にUserモデルがあるアプリでは`app/models/user.rb`の上書き確認が出るので、既存アプリへ入れるときは先にブランチを切ってください。`bin/rails g script cleanup`は`script/cleanup.rb`を1つ作るだけで、データ移行などの使い捨て処理の置き場になります。

## コマンド別の生成ファイル早見表

Rails 8.1.4の既定構成で、各ジェネレータを実行したときに作られたものです（○＝作る、－＝作らない）。

| コマンド                 | モデル | マイグレーション | コントローラ    | ビュー       | ルート          | ヘルパー | テスト         | jbuilder |
| -------------------- | --- | -------- | --------- | --------- | ------------ | ---- | ----------- | -------- |
| model                | ○   | ○        | －         | －         | －            | －    | ○（＋fixture） | －        |
| controller           | －   | －        | ○         | ○（アクション分） | ○（get）       | ○    | ○           | －        |
| resource             | ○   | ○        | ○（空）      | 空フォルダ     | ○（resources） | ○    | ○           | －        |
| scaffold             | ○   | ○        | ○（7アクション） | ○（6ファイル）  | ○（resources） | ○    | ○           | ○        |
| scaffold\_controller | －   | －        | ○（7アクション） | ○（6ファイル）  | ○（resources） | ○    | ○           | ○        |
| migration            | －   | ○        | －         | －         | －            | －    | －           | －        |

2023年ごろの解説記事では、scaffoldが`test/system/posts_test.rb`まで作るログが載っています。Rails 8.1.0で「scaffoldは既定でシステムテストを作らない」に変わったため（[railties 8.1.4のCHANGELOG](https://github.com/rails/rails/blob/v8.1.4/railties/CHANGELOG.md)の8.1.0の項）、今の版で同じログにはなりません。CSSなどのアセットも今のscaffoldは作りません。

## モデルを作る：rails generate model

モデル名は単数形で書きます。`bin/rails g model Article title:string body:text user:references published:boolean`を実行すると、`app/models/article.rb`、`db/migrate/日時_create_articles.rb`、`test/models/article_test.rb`、`test/fixtures/articles.yml`の4ファイルができ、マイグレーションの中身は次のとおりでした。

```
class CreateArticles < ActiveRecord::Migration[8.1]
  def change
    create_table :articles do |t|
      t.string :title
      t.text :body
      t.references :user, null: false, foreign_key: true
      t.boolean :published

      t.timestamps
    end
  end
end
```

`references`を書いたので、モデル側にも`belongs_to :user`が入ります。生成後は`bin/rails db:migrate`で適用し、関連の逆側（`has_many`）やバリデーションを書き足します。関連の種類と書き分けは[RailsのAssociationとは？6種類の関連付けと使い分け・実装手順](/tech/details/2883/)、モデルとテーブルの対応そのものは[Active Record（アクティブレコード）とは？Railsを支える設計パターンと基本を実例で解説](/tech/details/2913/)で扱っています。

### カラム型と修飾子（{}・:index・:uniq・!）

型は`string`・`text`・`integer`・`float`・`decimal`・`boolean`・`date`・`datetime`・`time`・`binary`などを使えます。型を省くと`string`になります。修飾子を付けたときの出力は次のとおりです。

| 書き方                           | マイグレーションの出力                                 |
| ----------------------------- | ------------------------------------------- |
| `name:string{50}`             | `t.string :name, limit: 50`                 |
| `'price:decimal{10,2}'`       | `t.decimal :price, precision: 10, scale: 2` |
| `email:string:uniq`           | `add_index :users, :email, unique: true`    |
| `published_at:datetime:index` | `add_index`（一意でない）                          |
| `'title:string!'`             | `t.string :title, null: false`              |

`!`修飾子はRails 8.0で入りました。Rails 8.1.4では、生成コマンドを文字列に戻すときにも`!`を出すよう修正されています。

### references・polymorphic・digest・tokenの生成結果

- `user:references`（`user:belongs_to`も同じ）：`t.references :user, null: false, foreign_key: true`と`belongs_to :user`。
- `commentable:references{polymorphic}`：`t.references :commentable, polymorphic: true, null: false`。参照先が1つに決まらないので外部キー制約は付きません。
- `password:digest`：`password_digest`列と`has_secure_password`。
- `api_token:token`：一意インデックス付きの`api_token`列と`has_secure_token :api_token`。

`digest`には落とし穴があります。`rails new`直後のGemfileはbcryptが`# gem "bcrypt", "~> 3.1.7"`とコメントアウトされたままで、この状態で`bin/rails g model Account password:digest`を実行すると、フィクスチャの生成で`uninitialized constant ... BCrypt (NameError)`が出て終了コード1で止まりました。その時点でマイグレーション・モデル・テストは作られたままです。bcryptのコメントを外して`bundle install`してから`bin/rails d model Account`で消し、もう一度生成します。

### decimal{10,2}の引用符とブレース展開

bashでもzshでも、引用符なしの`price:decimal{10,2}`は[ブレース展開](https://zsh.sourceforge.io/Doc/Release/Expansion.html)で`price:decimal10 price:decimal2`の2語に変わります。実行すると「Could not generate field ‘price’ with unknown type ‘decimal10’.」と出て**何も作られないのに終了コードは0**でした。スクリプトやCIで流すと失敗に気づけません。カンマを含む`{}`は`'price:decimal{10,2}'`のように引用符で囲みます。`{50}`のようにカンマが無ければ展開されません。`!`を含む引数も、bashの履歴展開を避けるため引用符で囲んでおくと安全です。

## コントローラを作る：rails generate controller

コントローラ名は複数形で、続けてカラムではなく**アクション名**を並べます。`bin/rails g controller Articles index show`のログは次のとおりでした。

```
      create  app/controllers/articles_controller.rb
       route  get "articles/index"
              get "articles/show"
      invoke  erb
      create    app/views/articles
      create    app/views/articles/index.html.erb
      create    app/views/articles/show.html.erb
      invoke  test_unit
      create    test/controllers/articles_controller_test.rb
      invoke  helper
      create    app/helpers/articles_helper.rb
```

追記されるルートは`get "articles/index"`の形で、`resources :articles`にはなりません。RESTの7アクションの実装まで生成するならscaffoldを使います。resourceはRESTのルートを追加しますが、既定ではコントローラのアクションを実装しません。`Admin::Users`のように名前空間を付けると、`app/controllers/admin/users_controller.rb`ができ、ルートは`namespace :admin do`のブロックの中に入りました。ルート追記が不要なら`--skip-routes`、ヘルパーが不要なら`--no-helper`、テストが不要なら`--skip-test-framework`を付けます。アクション名を書かなければ、既定構成では空のコントローラ、ビューのフォルダ、ヘルパー、コントローラのテストが生成されます。アクション別のビューとルートは生成されません。

## scaffoldで一式を作る：rails generate scaffold

`bin/rails g scaffold Post title:string body:text`は、モデル・マイグレーション・`resources :posts`・7アクションのコントローラに加え、ビューを`index`・`edit`・`show`・`new`・`_form`・`_post`の6ファイル、JSON用に`index.json.jbuilder`・`show.json.jbuilder`・`_post.json.jbuilder`を作りました。生成されたコントローラは、保存に失敗したとき`status: :unprocessable_content`で返し、更新・削除後のリダイレクトには`status: :see_other`を付けます。Turboの画面遷移がこの値を前提にしているので、書き換えるときも残します。

### scaffoldのシステムテスト生成オプション

前述のとおりRails 8.1のscaffoldはシステムテストを作りません。`--system-tests=true`を付けると`test/application_system_test_case.rb`と`test/system/posts_test.rb`が追加されます。あとから足すなら`bin/rails g system_test posts`です。RSpecでリクエストを検証したい場合は[request specとは？Rails 8・RSpec 8でのリクエストスペックの書き方](/tech/details/3993/)を参照してください。

### scaffoldを使う場面・使わない場面

scaffoldが向くのは、学習用・試作・社内の単純なマスタ管理のように、標準のCRUD画面をほぼそのまま使える場面です。業務ルールが絡む画面には使わないほうがよいです。7アクション・6ビュー・jbuilderのうち実際に使うのが一部なら、残りは誰も読まないコードとして残り続けます。その場合はmodelとcontrollerを個別に作り、必要なアクションだけ書きます。通常のアプリで`--api`を付けたドライランでは、erbのビューは生成対象に含まれず、ヘルパーとjbuilderが生成予定として表示されました。画面を持たないAPIサーバーは、最初から`rails new --api`で作るほうが不要物が出ません（[Rails APIとは？作成手順・JWT認証・React連携・Docker環境を実装解説【Rails 8.1】](/tech/details/2905/)）。雛形で済まない業務システムの設計・開発を外部に任せる場合は、[フルスクラッチ開発](/service/system/fullscratch/)の支援内容も参考になります。

## マイグレーションを作る：rails generate migration

マイグレーションは名前の付け方で中身が組み立てられます。実行して出力された処理は次のとおりです。

| コマンドの引数                                                | 生成された処理                                                       |
| ------------------------------------------------------ | ------------------------------------------------------------- |
| `AddPublishedAtToArticles published_at:datetime:index` | `add_column`＋`add_index`                                      |
| `RemoveBodyFromArticles body:text`                     | `remove_column :articles, :body, :text`                       |
| `AddUserRefToPosts user:references`                    | `add_reference :posts, :user, null: false, foreign_key: true` |
| `CreateJoinTableArticlesTags articles tags`            | `create_join_table :articles, :tags`                          |

`Remove`系では型まで書いておくと、`remove_column`に型が入り、`db:rollback`で列を戻せます。`CreateJoinTable`は2つのインデックスがコメントアウトされた状態で生成されるので、検索に使う向きのものを外して有効にします。`[8.1]`は生成時のRailsのマイグレーションAPIの版です。既存の`add_column`では済まない、本番の大きなテーブル変更や宣言的なスキーマ管理については[Ridgepoleとは？Schemafileでスキーマを管理する使い方と落とし穴](/tech/details/5805/)で比較しています。

## rails destroyで生成を取り消すときの落とし穴

`rails destroy`は生成したファイルを消すコマンドで、データベースやルートを元に戻す処理は一部しか持っていません。検証で次の2点が分かりました。

### マイグレーション適用後のrollbackとdestroyの実行順

Bookモデルを生成して`db:migrate`したあとに`bin/rails d model Book`を実行すると、マイグレーションファイルは消えますが、`books`テーブルは残り、`db/schema.rb`にも定義が残りました。`db:migrate:status`には次の行が出ます。

```
   up     20261027050723  ********** NO FILE **********
```

ファイルが無いのでこの状態からは`db:rollback`できません。正しい順番は、`bin/rails db:rollback`（複数前なら`db:migrate:down VERSION=日時`）でテーブルを戻してから`destroy`です。順番を間違えたら、同じ名前でもう一度`generate`してファイルを作り直すのではなく、`git`で消えたマイグレーションを戻してから`rollback`します（作り直すと日時が変わり別のマイグレーションになります）。

### controller削除時のアクション指定とルートの残存

`bin/rails g controller Articles index`のあとに`bin/rails d controller Articles`とアクション名を省いて実行すると、ファイルは消えても`config/routes.rb`の`get "articles/index"`は残りました。`bin/rails d controller Articles index`と生成時と同じアクション名を渡すと、ログに`route`の行が出てルートも消えます。[controllerジェネレータのソース](https://github.com/rails/rails/blob/v8.1.4/railties/lib/rails/generators/rails/controller/controller%5Fgenerator.rb)で、アクションが空のときはルートの処理を丸ごと飛ばす（`return if actions.empty?`）ためです。scaffoldとresourceの`resources :posts`は名前だけの`destroy`で消えました。

## 生成ファイルを減らす設定：config.generators

毎回オプションを付ける代わりに、`config/application.rb`で既定を変えられます。次の設定でscaffoldを実行すると、ヘルパー・jbuilder・テストが作られず、マイグレーションは`create_table :notes, id: :uuid`になりました。

```
# config/application.rb
config.generators do |g|
  g.helper false
  g.jbuilder false
  g.test_framework nil
  g.orm :active_record, primary_key_type: :uuid
end
```

`primary_key_type: :uuid`はPostgreSQLのようにUUID型を持つデータベース向けです。RSpecへの切り替えはこの設定に書かなくても済みます（下のよくある質問を参照）。1回だけ止めたい場合は`--no-helper`・`--no-jbuilder`・`--skip-test-framework`のようにコマンド側で指定します。

## カスタムジェネレータとテンプレートの上書き

チームで同じ形のクラスを繰り返し作るなら、ジェネレータにしておくと命名と置き場所がそろいます（[Rails Guides: Creating and Customizing Rails Generators & Templates](https://guides.rubyonrails.org/generators.html)）。

### rails generate generatorによる雛形の生成

`bin/rails g generator service`で`lib/generators/service/`の下に`service_generator.rb`・`USAGE`・`templates/`ができます。既定のMinitest構成では、これらに加えて`test/lib/generators/service_generator_test.rb`も生成されます。本体は`Rails::Generators::NamedBase`を継承し、`source_root`だけが書かれた状態です。

### NamedBaseとclass\_optionによるサービス生成の実装

サービスクラスを作るジェネレータを次のように書きました。publicメソッドは定義順に実行され、`class_name`や`file_name`は引数の名前から作られます。

```
# lib/generators/service/service_generator.rb
class ServiceGenerator < Rails::Generators::NamedBase
  source_root File.expand_path("templates", __dir__)
  class_option :call, type: :boolean, default: true, desc: "Define .call"

  def create_service_file
    template "service.rb.tt", File.join("app/services", class_path, "#{file_name}_service.rb")
  end
end

# lib/generators/service/templates/service.rb.tt
class <%= class_name %>Service
<% if options[:call] -%>
  def self.call(...) = new(...).call
<% end -%>

  def call
  end
end
```

`bin/rails g service Billing::Charge`で`app/services/billing/charge_service.rb`に`class Billing::ChargeService`ができ、`--no-call`を付けると`self.call`の行が消えました。`class_option`に書いた`desc`は`bin/rails g service --help`に表示され、`bin/rails d service Refund`で取り消しもできます。肥大化したモデルからサービスクラスへ処理を移すときの判断は[RailsのFat Model対策｜1500行model.rbを分割する4手法と判断基準](/tech/details/12933/)にまとめています。

### lib/templatesによる標準テンプレートの差し替え

新しいジェネレータを作らなくても、標準ジェネレータのテンプレートはアプリの`lib/templates`に同じパスで置くと差し替えられます。`lib/templates/active_record/model/model.rb.tt`にコメント行を足したテンプレートを置いて`bin/rails g model Tag name:string`を実行すると、`app/models/tag.rb`はそのテンプレートの内容で作られました。scaffoldのビューなら`lib/templates/erb/scaffold/index.html.erb.tt`です。元のテンプレートは、モデル用がactiverecord、ERBのscaffoldビュー用がrailtiesの各gemにある`lib/rails/generators`以下に置かれているので、コピーしてから書き換えると差分が小さく済みます。

## よくある質問

### rails generate viewというコマンドはありますか？

ありません。Rails 8.1.4で`bin/rails g view Foo`を実行すると「Could not find generator ‘view’.」で止まります。ビューだけ欲しいときは`bin/rails g controller Foos index`のようにアクション名を付けてcontrollerを作るか、`app/views`に直接ファイルを置きます。

### rails g と rails generate に違いはありますか？

違いはありません。`rails g`は`rails generate`の別名で、`rails d`も`rails destroy`の別名です。

### rails g model で references を指定すると何が作られますか？

`user:references`なら、マイグレーションに`t.references :user, null: false, foreign_key: true`（インデックス付き）、モデルに`belongs_to :user`が入ります。参照先の`users`参照される側の`users`テーブルを先に作るのが基本です。ただし、SQLiteでは参照先がなくても外部キー付きテーブルの作成自体は成功し、後続のデータ操作などでエラーになる場合があります。

### 生成の途中でエラーになり、ファイルが一部だけ作られたときは？

エラーの前に作られたファイルは残ります。原因（たとえば`password:digest`ならbcryptのgem）を直したら、同じ引数で`rails destroy`を実行して消し、生成し直します。`db:migrate`まで進めていない段階なら、テーブルの後始末は要りません。

### RSpecでテストファイルを生成するには？

Gemfileのdevelopment・testグループにrspec-railsを入れるだけで切り替わります。rspec-rails 8.0.4を入れたアプリでは、`config.generators`を書かなくても`bin/rails g model Widget name:string`のログが`invoke rspec`になり、`test/`の代わりに`spec/models/widget_spec.rb`がドライランで生成予定として表示されました（フィクスチャは生成対象に含まれません）。`spec_helper.rb`などの設定ファイルは`bin/rails g rspec:install`で別に作ります。

## 関連記事

- [ruby on rails を vscode で開発する環境構築【2026年版】Ruby LSP・デバッグ・Dev Container](/tech/details/2878/)
- [Active Record（アクティブレコード）とは？Railsを支える設計パターンと基本を実例で解説](/tech/details/2913/)
- [RailsのAssociationとは？6種類の関連付けと使い分け・実装手順](/tech/details/2883/)
- [Rails APIとは？作成手順・JWT認証・React連携・Docker環境を実装解説【Rails 8.1】](/tech/details/2905/)
- [request specとは？Rails 8・RSpec 8でのリクエストスペックの書き方](/tech/details/3993/)

---

出典: [Railsジェネレータ（rails generate）の使い方｜生成ファイル一覧と取り消し・カスタム生成【Rails 8.1.4】](<https://www.issoh.co.jp/tech/details/2874/>)（株式会社一創）
