bin/rails generate

Railsのファイルを生成するコマンド。省略が可能でbin/rails g ...でも同じ。

真逆のコマンドでdestroyがある。こちらも省略が可能でbin/rails d ...で同じ結果になる。

bin/rails g ...を実行した後でgdに変更しただけのコマンドを実行すれば何もしていないのと同じ状態になる。ただし、generateコマンドは指定された内容でファイルを生成するだけなので、おかしな内容を指定してファイルが生成されるとdestroyコマンドがパースエラーを起こすことがある。

Scaffold

bin/rails g scaffold モデル名 カラム:型 ...

モデル名はuser_accountUser_AccountUserAccountuser_accountsUser_AccountsUserAccountsのいずれでも同じ結果になる(正確にはアンダースコアの有無でapp/assets/stylesheets/*.scssのコメントに差異がある)。

カラム:型name:stringのように指定する。

例:bin/rails g scaffold user_account name:string birthday:date

bin/rails g scaffold ...コマンドは、app/assets/stylesheets/*.scssファイルが作られる点を除いて、bin/rails g scaffold_controller ...bin/rails g model ...を実行したのと同じ結果になる。

なので、基本的にはscaffoldは使わずにscaffold_controllermodelを使えば良いと思う。

bin/rails g resource モデル名 カラム:型 ...

bin/rails g resource UserAccount name:string birthday:dateを実行した場合、bin/rails g model UserAccount name:string birthday:datebin/rails g controller UserAccounts(複数形注意)を実行して、config/routes.rbresources :user_accountsした状態と同じになる。

Controller

bin/rails g scaffold_controller モデル名 カラム:型 ...

RESTfulな形でControllerとViewを作成する。カラムを指定すると、ViewやController内のpermitメソッドに指定したカラムが追加される。

bin/rails g controller コントローラー名 アクション ...

RESTfulでない形でControllerとViewを作成する。

コントローラー名はUserAccountsuser_accountsUserAccountsControlleruser_accounts_controllerのいずれでも同じ結果になる(正確にはアンダースコアの有無でapp/assets/stylesheets/*.scssのコメントに差異がある)。

ただし、user_accountUserAccountのように単数形で指定するとコントローラー名やViewのディレクトリも単数形になってネーミングルール違反になるので注意。

指定したアクションはGETメソッドのアクションとして追加されViewも作成される。GETメソッド以外のアクションは指定できない。

例として、bin/rails g controller UserAccounts index showを実行したとするとconfig/routes.rbは以下のような内容で生成される。

  get 'user_accounts/index'
  get 'user_accounts/show'

使い勝手はよくないので、scaffold_controllerを使うのが良いと思う。

Model

bin/rails g model モデル名 カラム:型 ...

指定したモデル名とカラムでモデルを作成する。

モデル名はuser_accountUser_AccountUserAccountuser_accountsUser_AccountsUserAccountsのいずれでもUserAccountモデルが作成される。

指定できる型などはbin/rails g model --helpを参照。

bin/rails g migration マイグレーション名 カラム:型 ...

指定したマイグレーション名でマイグレーションファイルを作成する。

マイグレーション名は特殊なパターンとして以下の2つがある。

  • create_user_accountのようにcreate_テーブル名をつけるとテーブル作成
  • add_columns_to_user_accountのようにadd_任意文字列_to_テーブル名とするとカラム追加

テーブル名は単数形でも複数形でもよい。この2つのパターンのときのみカラム:型の指定が意味を持つ。

例1:bin/rails g migration create_user_account name:string birthday:dateを実行した場合

# db/migrate/タイムスタンプ_create_user_account.rb
class CreateUserAccount < ActiveRecord::Migration[6.1]
  def change
    create_table :user_accounts do |t|
      t.string :name
      t.date :birthday

      t.timestamps
    end
  end
end

例2:bin/rails g migration add_name_birthday_columns_to_user_account name:string birthday:dateを実行した場合

# db/migrate/タイムスタンプ_add_name_birthday_columns_to_user_account.rb
class AddNameBirthdayColumnsToUserAccount < ActiveRecord::Migration[6.1]
  def change
    add_column :user_accounts, :name, :string
    add_column :user_accounts, :birthday, :date
  end
end

例3:bin/rails g migration user_account name:string birthday:dateを実行した場合

# db/migrate/タイムスタンプ_user_account.rb
class UserAccount < ActiveRecord::Migration[6.1]
  def change
  end
end

bin/rails g application_record

app/models/application_record.rbを作成するだけのコマンド。ActiveRecord以外のORMを使っている場合、--ormオプションを使うことで指定することができる。

bin/rails g active_record:application_record

bin/rails g application_record--ormを指定しなかった時と同じ。

View

bin/rails g helper ヘルパー名

指定した名前でヘルパーを作成する。

ヘルパー名はスネークケースとキャメルケースに区別はなく、単数形と複数形はそのまま名前に適用される。

bin/rails g jbuilder コントローラ名 カラム:型 ...

指定したコントローラーに以下の3つのjbuilderのビューを追加する。

  • index.json.jbuilder
  • show.json.jbuilder
  • _モデル名単数形.json.jbuilder

scaffold_controllerで作成されるjbuilderのビューと同じものが作られる。

bin/rails g assets NAME

指定した名前でassetsのJavaScriptファイルとStylesheetファイルを作成する。JavaScriptファイルは作成される条件があるのか作成されないことがある。

テスト

bin/rails g test_unit:*

minitestで各種テストの作成。

bin/rails g system_test システムテスト名

minitestでシステムテストが追加される。

bin/rails g integration_test コントローラ名

Request Specを作成する。bin/rails g rspec:requestと同じ。

bin/rails g rspec:request コントローラ名

Request Specを作成する。

bin/rails g rspec:integration コントローラ名

Request Specを作成する。bin/rails g rspec:requestと同じ。

bin/rails g rspec:scaffold コントローラ名

spec/requestsspec/viewsspec/routingのテストを追加する。

その他のコマンド

  • rspec:channel
  • rspec:controller
  • rspec:feature
  • rspec:generator
  • rspec:helper
  • rspec:install
  • rspec:job
  • rspec:mailbox
  • rspec:mailer
  • rspec:model
  • rspec:system
  • rspec:view

その他機能追加

bin/rails g channel チャンネル名

ActionCableのチャンネルを追加する。

bin/rails g job ジョブ名

ActiveJobのジョブを追加する。

bin/rails g mailer メーラ名 メソッド ...

ActionMailerのメーラを追加する。

bin/rails g mailbox メールボックス名

ActionMailboxのメールボックスを追加する。

その他

bin/rails g benchmark ベンチマーク名 ケース ...

ベンチマークをとるためのスクリプトを作成する。ベンチマーク名はスネークケースでもキャメルケースでも結果はスネークケースのファイル名になる。

例:bin/rails g benchmark benchmark_script 実装例1 実装例2を実行した場合

# script/benchmarks/benchmark_script.rb
# frozen_string_literal: true

require_relative "../../config/environment"

# Any benchmarking setup goes here...



Benchmark.ips do |x|
  x.report("実装例1") { }
  x.report("実装例2") { }

  x.compare!
end

x.report("実装例1") { }のブロックに比較したいコードを書く。

実行方法はruby script/benchmarks/benchmark_script.rbのように単にrubyコマンドにファイルを指定するだけで良い。以下のような結果になる。

Warming up --------------------------------------
                実装例1     5.174k i/100ms
                実装例2     5.416k i/100ms
Calculating -------------------------------------
                実装例1     54.041k (± 3.6%) i/s -    274.222k in   5.081149s
                実装例2     53.707k (± 4.0%) i/s -    270.800k in   5.050139s

Comparison:
                実装例1:    54041.0 i/s
                実装例2:    53706.8 i/s - same-ish: difference falls within error

benchmark-ipsというgemがデフォルトのベンチマークツールなので、細かい設定などはそちらのドキュメントを参照。

bin/rails g generator ジェネレータ名

bin/rails generatebin/rails g)コマンドで使えるサブコマンドを追加する。

例えば、bin/rails g generator fooを実行した場合、bin/rails g foo 名前というコマンドが追加される。ジェネレータの作り方はRails ジェネレータとテンプレート入門 - Railsガイドを参照。

bin/rails g task タスク名

Rakeタスクを追加する。