【Rails】envメソッドで環境確認する方法と各コマンドの環境指定方法とは?

Rails

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つの環境が用意されています。

Railsの3つの環境

  • 開発環境 - アプリケーション開発を行う作業場所
  • テスト環境 - 作成した機能などをテストする場所
  • 本番環境 - 完成されたアプリケーションをユーザーが利用する場所

開発規模や運用方法によって他の環境も追加される場合がありますが、上記の3つの環境がアプリケーション開発を進める上で基本的な環境です。それでは、各環境の役割について詳しく解説していきます。

開発環境(development)
リンクをコピーしました

開発環境は、開発者が機能の実装などアプリケーション開発を行う作業場所です。

Railsの開発環境では、app/配下のファイルで記述したものを変更しリロードするだけで変更点が反映されるので、開発の時間コストが少ないですがレスポンスは遅くなります。逆に、config/routes.rbの様なapp/配下にないファイルの場合はサーバーを再起動しないと反映されないので注意してください。

また、開発環境は、config/environments/development.rbのファイルのオプションを変更することで設定する事が出来ます。

テスト環境(test)
リンクをコピーしました

テスト環境は、開発環境で作成した機能などをテストする場所です。

下記は、RSpec でテストを実行した場合の画面です。

rspecのテスト実行時

テスト実行時に作成されるデータは、テストが終わると消えます。そして、テスト毎にmigrationは実行されたり、テストの為だけに毎回環境が用意されます。

また、テスト環境は、config/environments/test.rbのファイルのオプションを変更することで設定する事が出来ます。

本番環境(production)
リンクをコピーしました

本番環境は、ユーザーが完成したアプリケーションを実際に利用する環境です。

本番環境は開発環境と下記の点で異なります。

  1. app/配下のファイルを変更しても読み込まれない
  2. リロードしてもログがterminal上に吐き出されない
  3. メモリとかにソースを貯めておいて、リクエストが来てもすぐに返せる
  4. 事前に手動でコンパイルを実行していることによって、すぐにレンダリング出来る様にしている

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の部分で開発環境で起動していることを確認できます。

コンソール | console起動
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に文字列で環境を格納します。

コンソール | 環境をdevelopからtestへ変更する
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 [環境名]で起動させます。

コンソール | 環境をtestに指定して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の部分で開発環境でサーバーが起動している事が分かります。

コンソール | server起動
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に省略する事も出来ます。

コンソール | serverの環境を指定して起動する
1
2
3
rails server --environment [環境]

rails server -e [環境] # 上記と同様

rails serverでテスト環境を指定して起動させるには、下記のrails server --environment testを実行します。

コンソール | テスト環境でserverを起動させる
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で設定したデータベースを参照して各操作を行います。
デフォルトでは、開発環境のデータベースが参照されます。

config/database.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で環境を指定します。

コンソール | rails dbコマンドで開発環境以外のデータベースで実行する場合
1
rails db:コマンド名 RAILS_ENV = [環境]

環境変数RAILS_ENVは、Railsの実行環境を定義してくれます。環境変数については、dotenv-railsの導入方法と使い方を参考にしてください。

先ほどのpostsテーブルをテスト環境のデータベースcarrier_wave_sample_testに反映させるには、下記の様にrails db:migrateのコマンド実行時に環境変数RAILS_ENVtestを渡して実行します。

コンソール | 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が必要な理由を参考にしてください。

Pikawakaマークポイント

  1. 各環境のデータベースは config/database.ymlで設定されます。
  2. rails dbコマンドを実行する場合は、デフォルトで開発環境のデータベースが参照されます。
  3. 開発環境以外のデータベースを使う場合は、環境変数RAILS_ENVで環境を指定し実行します。

環境毎の処理と設定
リンクをコピーしました

Railsは、開発・テスト・本番の3つの環境が用意されていますが、この環境毎に処理を変更したり、環境毎にインストールするgemを設定する事が出来ます。

環境毎に処理を変更する
リンクをコピーしました

本番環境では処理Aを実行して、開発環境では処理B、テスト環境では処理Cと環境毎に処理を分けたい場合は、下記の様に論理値を返すRails.env.[環境]?を使います。

erb | 環境毎に処理を分ける
1
2
3
4
5
6
7
<% if Rails.env.production? %>
    # 処理A
<% elsif Rails.env.development? %>
    # 処理B
<% elsif Rails.env.test? %>
    処理C
<% end %>

例えば、下記のh2は「投稿フォーム」という名前になっていますが、これを環境毎に「環境用 + 投稿フォーム」の表示にする場合を例にして解説します。

投稿フォーム

環境毎に表示を変えるには、下記の様にします。

erb | 環境毎にタイトルを変える
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を分けるには、Gemfilegroupブロックを下記の様に使います。

Gemfile | 環境毎にインストールしたいgemを分ける
1
2
3
group :環境 do
    # インストールしたいgemを記述
end

実際には、下記の様に環境毎に使い分けたいgemを記述していきます。

環境毎にインストールするgemを分ける

また、特定の環境を取り除いてgemをインストールしたい場合は、下記の様に--withoutオプションを使って取り除く環境を指定する事が出来ます。

コンソール | 特定の環境を取り除いてgemをインストールする
1
bundle install --without [環境]

もし本番環境の時に、テスト環境と開発環境を除いたgemをインストールする場合は下記の様に指定します。

コンソール | 開発環境とテスト環境を取り除いた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は、データベースの設定をするファイルです。
下記の様に、ステージング環境のデータベースを追加します。

database.yml | ステージング環境のデータベースを追加
1
2
3
staging:
  <<: *default
  database: carrier_wave_sample_staging

ステージング環境のデータベースを追加すると、下記の様にdatabase.ymlには4つの環境のデータベースが設定されます。

ステージング環境のデータベースを追加

ステージング環境のデータベースを作成
リンクをコピーしました

config/database.ymlで設定したステージング環境のデータベースを下記のコマンドで作成します。
環境変数のRAILS_ENVにstagingを渡して実行します。

database.yml | ステージング環境のデータベースを作成
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をつけて実行します。

ステージング環境のデータベースにpostsテーブルとカラムを追加
1
2
3
4
5
rails db:migrate RAILS_ENV=staging
== 20200203063014 CreatePosts: migrating ======================================
-- create_table(:posts)
   -> 0.0404s
== 20200203063014 CreatePosts: migrated (0.0405s) =============================

ステージング環境のデータベースにpostsテーブルを追加する

これでステージング環境のデータベースにテーブルを追加する事が出来ました。

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が便利です。

config/environments/staging.rb | config.public_file_server.enabledの値をtrueに変更
1
2
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? # 変更前
config.public_file_server.enabled = true # 変更後

また、sass-railsのgemを使用している場合は、下記の箇所のコメントアウトを外して下さい。

config/environments/staging.rb | sass-railsを使用している場合
1
# config.assets.css_compressor = :sass 

3. アセットプリコンパイルの実行
リンクをコピーしました

開発環境で自動的に行なっていたコンパイルは、本番環境では処理速度の関係で自動的に行われないので本番環境でコンパイルするには、コマンドを手動で実行する必要があります。今回のステージング環境でも本番環境の設定をコピーしたものなので手動でコマンド実行します。

その前に、次に行うサーバー起動でCSSが反映されているか確認するために、H2のスタイルを変更しておきます。app/assets/stylesheets/posts.scssに下記のコードを追加しましょう。

app/assets/stylesheets/posts.scss | ステージングサーバーで変更が反映されているか確認する為に追加
1
2
3
4
h2 {
  background: #5792ff;
  padding: 0.5em;
}

次のサーバー起動の際に下記の様にH2のスタイルが変更されていれば成功です。

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に下記のコードを追加します。

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で現在の環境を確認する事が出来ます。
  • 各コマンドを実行する際に、環境を指定しなかった場合は開発環境が使われます。