更新日:
【Rails】 envメソッドで環境を確認する方法と各コマンドの指定方法
 
envメソッドとは、現在の環境を確認する事が出来たり環境によって処理を切り分ける事が出来るメソッドです。
1
2
3
4
5
6
7
8
9
10
11
# 環境を確認する
irb(main):001:0> Rails.env
=> "development"
irb(main):002:0> Rails.env.development?
=> true
# 環境を設定する
irb(main):004:0> Rails.env = "test"
=> "test"
irb(main):005:0> Rails.env
=> "test"
Rails.envで現在の環境を確認し、Rails.env.development?の様に論理値を返して判定するメソッドで環境によって処理を切り分けます。
Railsの環境の基本操作
Railsで用意されている環境や基本操作について解説していきます。まずは、各環境の役割を理解して操作方法をマスターしましょう。
各環境の役割
Railsには、3つの環境が用意されています。

- 開発環境 - アプリケーション開発を行う作業場所
- テスト環境 - 作成した機能などをテストする場所
- 本番環境 - 完成されたアプリケーションをユーザーが利用する場所
開発規模や運用方法によって他の環境も追加される場合がありますが、上記の3つの環境がアプリケーション開発を進める上で基本的な環境です。それでは、各環境の役割について詳しく解説していきます。
開発環境(development)
開発環境は、開発者が機能の実装などアプリケーション開発を行う作業場所です。
Railsの開発環境では、app/配下のファイルで記述したものを変更しリロードするだけで変更点が反映されるので、開発の時間コストが少ないですがレスポンスは遅くなります。逆に、config/routes.rbの様なapp/配下にないファイルの場合はサーバーを再起動しないと反映されないので注意してください。
また、開発環境は、config/environments/development.rbのファイルのオプションを変更することで設定する事が出来ます。
テスト環境(test)
テスト環境は、開発環境で作成した機能などをテストする場所です。
下記は、RSpec でテストを実行した場合の画面です。

テスト実行時に作成されるデータは、テストが終わると消えます。そして、テスト毎にmigrationは実行されたり、テストの為だけに毎回環境が用意されます。
また、テスト環境は、config/environments/test.rbのファイルのオプションを変更することで設定する事が出来ます。
本番環境(production)
本番環境は、ユーザーが完成したアプリケーションを実際に利用する環境です。
本番環境は開発環境と下記の点で異なります。
- app/配下のファイルを変更しても読み込まれない
- リロードしてもログがterminal上に吐き出されない
- メモリとかにソースを貯めておいて、リクエストが来てもすぐに返せる
- 事前に手動でコンパイルを実行していることによって、すぐにレンダリング出来る様にしている
2番目のログですが、開発環境では投稿フォームを作成した際やリロードした際に右側のterminalにログが吐き出されます。

しかし、下記の本番環境では投稿フォームを作成した際やリロードした際にログが吐き出されていません。

また、本番環境は、config/environments/production.rbのファイルのオプションを変更することで設定する事が出来ます。
各コマンドの環境指定方法
コマンド実行時に環境指定が無い場合は、デフォルトの環境として開発環境で各コマンドが実行されます。
開発環境以外にする場合は環境を指定しますが、各コマンドによって環境指定方法が異なります。
| コマンド | 環境指定方法 | 例 | 
|---|---|---|
| rails console | rails console [環境] | rails console test | 
| rails server | rails sever --environment [環境] | rails sever --environment test | 
| rails db | RAILS_ENV | rails db:migrate RAILS_ENV=test | 
それでは、各コマンドの環境指定方法を確認していきます。
rails cosole
rails cosoleを実行すると、開発環境でconsoleが起動します。
下記のLoading development environmentの部分で開発環境で起動していることを確認できます。
1
2
3
4
rails c #rails consoleのエイリアスです
Running via Spring preloader in process 37649
Loading development environment (Rails 5.2.4.1)  ← consoleで使用する環境
irb(main):001:0>
consoleを起動している状態でRails.envを実行すると、現在の環境を確認する事が出来ます。
1
2
 irb(main):001:0>Rails.env
=> "development"
console起動後に開発環境以外の環境へ変更する場合は、下記の様にRails.envに文字列で環境を格納します。
1
2
3
4
5
6
7
 irb(main):001:0>Rails.env
=> "development"
irb(main):002:0>  Rails.env = "test"
=> "test"
irb(main):003:0> Rails.env
=> "test"
また、console起動時に開発環境以外を指定する場合は、下記の様にrails console [環境名]で起動させます。
1
2
3
4
rails c test   # rails console test と同等です
Running via Spring preloader in process 38189
Loading test environment (Rails 5.2.4.1)  ← consoleで使用する環境
irb(main):001:0> 
Loading test environmentの部分でテスト環境が使用されている事が分かります。
rails server
rails serverを実行すると、開発環境のwebサーバーが起動します。Rails5だとPumaが起動します。
下記のEnvironment: developmentの部分で開発環境でサーバーが起動している事が分かります。
1
2
3
4
5
6
7
8
9
10
rails s # rails serverのエイリアスです
=> Booting Puma
=> Rails 5.2.4.1 application starting in development 
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.12.2 (ruby 2.5.1-p57), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development ← serverで使用する環境
* Listening on tcp://localhost:3000
Use Ctrl-C to stop
環境を変更するには、下記の様にrails serverコマンドに--environmentで環境を指定します。--environmentを-eに省略する事も出来ます。
1
2
3
rails server --environment [環境]
rails server -e [環境] # 上記と同様
rails serverでテスト環境を指定して起動させるには、下記のrails server --environment testを実行します。
1
2
3
4
5
6
7
8
9
10
rails s --environment test # rails server --environment testと同等です
=> Booting Puma
=> Rails 5.2.4.1 application starting in test 
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.12.2 (ruby 2.5.1-p57), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: test  ← serverで使用する環境
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
上記のEnvironment: testの箇所で、テスト環境で起動したことが確認出来ました。
rails db
rails dbコマンドは、下記のconfig/databae.ymlで設定したデータベースを参照して各操作を行います。
デフォルトでは、開発環境のデータベースが参照されます。

例えば、rails dbコマンドで最も使われるrails db:migrateは、データベースのテーブルやカラムを変更しますが、環境を指定しないでコマンドを実行した場合は、開発環境のデータベースを参照してテーブルやカラムの変更を行います。
1
rails db:migrate
先ほどのconfig/databae.ymlの開発環境とテスト環境を例にもう少し詳しく解説します。
現在どちらのデータベースにもテーブルは何も無い状態です。

そこで、「記事を管理するpostsテーブルとカラム」を追加するために、データベースの設計図となるマイグレーションファイルを下記の様に追加して記述します。

rails db:migrateを実行すると、未実行のマイグレーションファイルが順番に実行されます。
今回は、上記の「postsテーブルとそのカラムを追加したマイグレーションファイル」だけなので、下記の結果になります。
1
2
3
4
5
rails db:migrate
== 20200203063014 CreatePosts: migrating ======================================
-- create_table(:posts)
   -> 0.0270s
== 20200203063014 CreatePosts: migrated (0.0272s) =============================
そして、rails db:migrateを実行した時に特に環境を指定しなかったので
開発環境のデータベースcarrier_wave_sample_developmentにpostsテーブルが追加されます。

一方でテスト環境のデータベースcarrier_wave_sample_testには、rails db:migrateを実行しても特に反映される事がないので、下記の様に何も無い状態のままです。

rails dbコマンドのデフォルトでは開発環境のデータベースが使用されるので、開発環境以外のデータベースを使いたい場合は、コマンド実行時に環境変数のRAILS_ENVで環境を指定します。
1
rails db:コマンド名 RAILS_ENV = [環境]
環境変数RAILS_ENVは、Railsの実行環境を定義してくれます。環境変数については、dotenv-railsの導入方法と使い方を参考にしてください。
先ほどのpostsテーブルをテスト環境のデータベースcarrier_wave_sample_testに反映させるには、下記の様にrails db:migrateのコマンド実行時に環境変数RAILS_ENVにtestを渡して実行します。
1
2
3
4
5
6
rails db:migrate RAILS_ENV=test
== 20200203063014 CreatePosts: migrating ======================================
-- create_table(:posts)
   -> 0.0487s
== 20200203063014 CreatePosts: migrated (0.0488s) =============================
今回は、rails db:migrate実行時にテスト環境を指定したので
テスト環境のデータベースcarrier_wave_sample_testにpostsテーブルが追加されます。

rails dbコマンドを使う際にデフォルトの開発環境以外のデータベースを使う場合は
環境変数のRAILS_ENVに環境を指定してコマンドを実行しましょう。
また、今回は解説を省きましたがrails dbコマンドを使う際は、bundle installしたgemを使う為にbundle execを付けるようにしましょう。詳しくは、bundle execが必要な理由を参考にしてください。
環境毎の処理と設定
Railsは、開発・テスト・本番の3つの環境が用意されていますが、この環境毎に処理を変更したり、環境毎にインストールするgemを設定する事が出来ます。
環境毎に処理を変更する
本番環境では処理Aを実行して、開発環境では処理B、テスト環境では処理Cと環境毎に処理を分けたい場合は、下記の様に論理値を返すRails.env.[環境]?を使います。
1
2
3
4
5
6
7
<% if Rails.env.production? %>
    # 処理A
<% elsif Rails.env.development? %>
    # 処理B
<% elsif Rails.env.test? %>
    処理C
<% end %>
例えば、下記のh2は「投稿フォーム」という名前になっていますが、これを環境毎に「環境用 + 投稿フォーム」の表示にする場合を例にして解説します。

環境毎に表示を変えるには、下記の様にします。
1
2
3
4
5
6
7
8
9
<div class="heading">
    <% if Rails.env.test? %>
        <h2>テスト用 投稿フォーム</h2>
    <% elsif Rails.env.development? %>
        <h2>開発用 投稿フォーム</h2>
    <% elsif Rails.env.production? %>
        <h2>本番用 投稿フォーム</h2>
    <% end %>
</div>
rails serverとサーバーを立ち上げると、開発環境がデフォルトになるので下記の結果になります。

そして、テスト環境用サーバーを立ち上げる為にrails sever --environment testを実行すると、下記の結果になります。

この様に環境毎に処理を分けたい場合は、Rails.env.[環境]?で分ける事が出来ます。
gem
環境毎にインストールしたいgemを分けるには、Gemfileにgroupブロックを下記の様に使います。
1
2
3
group :環境 do
    # インストールしたいgemを記述
end
実際には、下記の様に環境毎に使い分けたいgemを記述していきます。

また、特定の環境を取り除いてgemをインストールしたい場合は、下記の様に--withoutオプションを使って取り除く環境を指定する事が出来ます。
1
bundle install --without [環境]
もし本番環境の時に、テスト環境と開発環境を除いたgemをインストールする場合は下記の様に指定します。
1
bundle install --without development test
環境設定ファイル
Railsアプリケーションでは、config/environments/に各環境の設定が出来るファイルがあります。

- development.rb- 開発環境用の設定ファイル
- production.rb- 本番環境用の設定ファイル
- test.rb- テスト環境用の設定ファイル
それぞれの環境に必要な設定は上記のファイルに記述しましょう。
次の章で詳しく解説しますが、このデフォルトで用意されている3つの環境以外に新たな環境を追加する場合は、上記にファイルを追加します。
新しいenvを追加する方法
Railsには、開発・テスト・本番の3つの環境がデフォルトで用意されていますが、新しく環境を追加する事が出来ます。

今回は、ステージング環境(staging)を追加します。ステージング環境は、本番へデプロイする前にテストする環境です。
1. ステージング環境のデータベース用意
前章でも解説しましたが、config/database.ymlは、データベースの設定をするファイルです。
下記の様に、ステージング環境のデータベースを追加します。
1
2
3
staging:
  <<: *default
  database: carrier_wave_sample_staging
ステージング環境のデータベースを追加すると、下記の様にdatabase.ymlには4つの環境のデータベースが設定されます。

ステージング環境のデータベースを作成
config/database.ymlで設定したステージング環境のデータベースを下記のコマンドで作成します。
環境変数のRAILS_ENVにstagingを渡して実行します。
1
2
rails db:create RAILS_ENV=staging
Created database ‘carrier_wave_sample_staging’
コマンド実行すると、下記の様にconfig/database.ymlで設定したステージング環境のデータベースcarrier_wave_sample_stagingが作成されます。

このままだとテーブルが空の状態なので、先ほどのマイグレーションファイルに追加したpostsテーブルをrails db:migraeteを実行して作成します。この時、ステージング環境で実行するためにRAILS_ENV=stagingをつけて実行します。
1
2
3
4
5
rails db:migrate RAILS_ENV=staging
== 20200203063014 CreatePosts: migrating ======================================
-- create_table(:posts)
   -> 0.0404s
== 20200203063014 CreatePosts: migrated (0.0405s) =============================

これでステージング環境のデータベースにテーブルを追加する事が出来ました。
2. config/environments/staging.rbを作成
config/environments/production.rbをコピーして、config/environments/にstaging.rbのファイルを作成します。

そして、config/environments/staging.rb内のconfig.public_file_server.enabledの値を下記の様にtrueに変更するか、または環境変数RAILS_SERVE_STATIC_FILESを定義してください。環境変数の管理は、dotenv-railsが便利です。
1
2
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? # 変更前
config.public_file_server.enabled = true # 変更後
また、sass-railsのgemを使用している場合は、下記の箇所のコメントアウトを外して下さい。
1
# config.assets.css_compressor = :sass 
3. アセットプリコンパイルの実行
開発環境で自動的に行なっていたコンパイルは、本番環境では処理速度の関係で自動的に行われないので本番環境でコンパイルするには、コマンドを手動で実行する必要があります。
今回のステージング環境でも本番環境の設定をコピーしたものなので手動でコマンド実行します。
その前に、次に行うサーバー起動でCSSが反映されているか確認するために、H2のスタイルを変更しておきます。app/assets/stylesheets/posts.scssに下記のコードを追加しましょう。
1
2
3
4
#h2 {
  background: #5792ff;
  padding: 0.5em;
}
次のサーバー起動の際に下記のようにH2のスタイルが変更されていれば成功です。

そして、下記のコマンドでコンパイルを実行します。
1
rails assets:precompile RAILS_ENV=staging
上記のコマンドを実行すると、下記の様に表示されます。

successと表示されたらコンパイル成功です。しかし、Yarn executable was not detected in the system.とエラーが出たらRails5以降で必要になったyarnが自身の環境にない状態なので、yarnのインストールしてからコンパイルを実行して下さい。
4. ステージング環境のサーバーを起動
サーバ起動前にステージング環境で動いている事を分かりやすくする為にapp/views/posts/new.html.erbに下記のコードを追加します。
1
2
3
4
5
6
7
8
9
10
11
<div class="heading">
    <% if Rails.env.test? %>
        <h2>テスト用 投稿フォーム</h2>
    <% elsif Rails.env.development? %>
        <h2>開発用 投稿フォーム</h2>
    <% elsif Rails.env.staging? %>
        <h2>ステージング用 投稿フォーム</h2><%# ステージングの条件を追加 %>
    <% elsif Rails.env.production? %>
        <h2>本番用 投稿フォーム</h2>
    <% end %>
</div>
そして、rails serverに--environment stagingを指定し実行してステージング環境のサーバーを起動します。
1
rails s --environment staging # rails server --environment stagingと同等です
http://localhost:3000/にアクセスすると、下記の様にステージング環境が正常に動作しています。また、追加したH2のCSSも反映されています。

開発規模によってRailsで用意されている環境以外に必要な場合は、簡単に環境を追加する事が出来ます。
この記事のまとめ
- Railsで用意されている環境は、開発・テスト・本番の3つの環境がある
- Rails.envで現在の環境を確認する事が出来る
- 各コマンドを実行する際に、環境を指定しなかった場合は開発環境が使われる
