Railsアプリケーションを作成するとconfigディレクトリ配下に、application.rbとenvironmentsディレクトリが生成されます。
その中にはdevelopment.rb、 production.rb、 test.rbの3つのファイルが生成されています。
ここでは、そもそもこのconfigディレクトリとは何か?application.rbやその中にはdevelopment.rb、 production.rb、 test.rbの違いは何か?いつどうやって使うのかについてまとめています。
configディレクトリとは何か?
configディレクトリはrailsアプリケーションの設定に関するファイルを保存するディレクトリです。
ルーティングを記述するroutes.rb
やDBの仕様書であるdatabase.yml
もこの中に作成されます。
application.rb
configディレクトリ直下にapplication.rbがあります。
これは、railsの環境は、開発環境(development)、テスト環境(test)、本番環境(production)のすべての環境に共通の設定を記述したファイルです。
なお、environments配下のファイルに同じ変数に対する設定がある場合は、そちらを優先します。
environmentsディレクトリとは何か?
environmentsディレクトリはプロジェクトの実行環境ごとの設定ファイルを保存しているディレクトリです。
railsの環境は、開発環境(development)、テスト環境(test)、本番環境(production)の3つがあります。
開発環境、テスト環境、本番環境の違い
rails s
やrails c
などrailsコマンドを実行する際に環境の指定がない場合は、デフォルトで開発環境(development)となります。
開発環境(development)とは何か?
開発環境(development)においては、appディレクトリ配下のファイルに変更があった場合に自動で読み込みを行います。
webpack使用時はbin/webpack-dev-serve
のコマンドを実行すると、jsやscssの変更を検知してコンパイルを自動で走らせることもできます。
変更点をすぐに確認できるので便利ですが、その分負荷が高く本番には向きません。(そもそも本番環境で頻繁に変更を加えることはしません)
開発環境の設定はconfig/environments/development.rb
で行います。
テスト環境(test)とは何か?
テスト環境(test)とは、開発環境で作成した機能などをテストするための環境です。バグ検証のテスティングフレームワークであるRSpecなどを使う時に使用します。
テスト環境の設定はconfig/environments/test.rb
で行います。
RSpecとは?
Ruby Specの略で、RubyやRuby on Railsでバグ検証を自動化するツールです。
本番環境(production)とは何か?
本番環境(production)とは、本番公開用の環境です。
開発環境に備わっていた、変更内容の自動検知・反映や自動コンパイルなどの機能がない軽量な環境になります。
本番環境の設定はconfig/environments/production.rb
で行います。
現在の環境を確かめる方法
現在の環境を確かめるには、RailsコンソールでRails.env
を実行します。すると現在の環境が表示されます。
実例
# rails c
Running via Spring preloader in process 178
Loading development environment (Rails 6.1.3.1)
irb(main):003:0> Rails.env
=> "development"
環境を変更する方法
環境を変更するには以下のコマンドを実行します。
Rails.env="環境"
実例
例えば、本番環境(production)に変更する場合は以下のようにします。
#環境をprodcutionに変更
irb(main):004:0> Rails.env = "production"
=> "production"
#確認
irb(main):005:0> Rails.env
=> "production"
環境を指定する方法
コマンド実行時に環境を指定することもできます。各コマンドによって指定方法が異なるので注意が必要です。
なお、デフォルトは開発環境(development)です。
rails sでサーバー起動時に環境を指定する方法
rails sでサーバー起動時に環境を指定するには以下のように「-e」オプションを使って環境を指定します。
rails s -e <開発環境>
-eは–environmentと同じです。
実例
rails s -e production
Railsコンソールの環境を指定する
Railsコンソール起動時に実行環境を指定する場合は以下のようにします。
・rails c <開発環境>
実例
rails c production
rails dbを実行する環境を指定する
rails dbコマンドで処理を実行するときに、どのDB環境に対してコマンドを実行するかを指定するときは以下のようにします。
rails db:<処理> RAILS_ENV=<開発環境>
実例
rails db:migrate RAILS_ENV=production
develompemt.rbの中身詳細
develompemt.rbとは、開発環境の設定を記述したファイルです。
require "active_support/core_ext/integer/time"
Rails.application.configure do
#ここでの設定はconfig/application.rbよりも優先する。
#キャッシュを使わず変更点を自動検知しリロードするかどうか(falseの場合キャッシュを使わないので反応速度は遅くなる)
#prodcution環境などキャッシュを使う場合はtrueにっている
config.cache_classes = false
# eager loading用の名前空間を一括読み込するか
config.eager_load = false
# エラーが発生した場合に情報をHTTPレスポンスに出力するかどうか
config.consider_all_requests_local = true
# Action Controllerが提供するキャッシュ機能を使うかどうか
if Rails.root.join('tmp', 'caching-dev.txt').exist?
config.action_controller.perform_caching = true
config.action_controller.enable_fragment_cache_logging = true
config.cache_store = :memory_store
config.public_file_server.headers = {
'Cache-Control' => "public, max-age=#{2.days.to_i}"
}
else
config.action_controller.perform_caching = false
config.cache_store = :null_store
end
# アップロードしたファイルをローカルに保存する。オプションはconfig/storage.ymlを参照
config.active_storage.service = :local
# mailerが送信を失敗した時にエラー表示するかどうか
config.action_mailer.raise_delivery_errors = false
# mailerのテンプレートでフラグメントキャッシュを有効にするべきかどうか(指定がない場合はtrue)
config.action_mailer.perform_caching = false
# 環境に対する非推奨レポート出力をどこに出力するか(development環境は:log、production環境は:notify、test環境は:stderr)
config.active_support.deprecation = :log
# 非推奨のエラーを許可しないようにするか
config.active_support.disallowed_deprecation = :raise
# 非推奨の警告を許可しないようにするか
config.active_support.disallowed_deprecation_warnings = []
# マイグレーションがペンディングされているかどうかをチェックするミドルウェアを設定する
config.active_record.migration_error = :page_load
# ログのDBクエリをハイライトする
config.active_record.verbose_query_logs = true
# デバッグ用にアセットの連結と圧縮をやめるかどうか
config.assets.debug = true
# アセットへのリクエストのログ出力を無効にするかどうか
config.assets.quiet = true
# i18n(internationalization: 国際化)ライブラリに沿って翻訳するかどうか
# config.i18n.raise_on_missing_translations = true
# レンダリングしているファイル名に注釈をつけるかどうか
config.action_view.annotate_rendered_view_with_filenames = true
# ファイル更新の自動検出に使われるクラスを指定
config.file_watcher = ActiveSupport::EventedFileUpdateChecker
# Action Cableサーバーへのアクセスを許可するかどうか
config.action_cable.disable_request_forgery_protection = true
end
test.rbの中身詳細
test.rbとは、開発環境の設定を記述したファイルです。
require "active_support/core_ext/integer/time"
#テスト環境は、テストスイートを実行するためにのみ使用する。
#テストスイートとは、テストの実行単位で目的や対象毎にテストケースをまとめたもの。
Rails.application.configure do
#ここでの設定はconfig/application.rbよりも優先する。
#キャッシュを使わず変更点を自動検知しリロードするかどうか(falseの場合キャッシュを使わないので反応速度は遅くなる)
config.cache_classes = false
config.action_view.cache_template_loading = true
# eager loading用の名前空間を一括読み込するか
config.eager_load = false
#publicファイルサーバーのCache-Controlの設定
config.public_file_server.enabled = true
config.public_file_server.headers = {
'Cache-Control' => "public, max-age=#{1.hour.to_i}"
}
# エラーをすべて表示する。キャッシュは使わない
config.consider_all_requests_local = true
config.action_controller.perform_caching = false
config.cache_store = :null_store
# 例外は読みまない(例外テンプレートを使用するため)
config.action_dispatch.show_exceptions = false
# CSRF対策をオフにする。
config.action_controller.allow_forgery_protection = false
# 一時ディレクトリのアップロードファイルを保存する
config.active_storage.service = :test
config.action_mailer.perform_caching = false
# mailerのメール送信はテスト環境内のみ(実際にはメール送信しない)
config.action_mailer.delivery_method = :test
# 非推奨の通知を標準出力に出す
config.active_support.deprecation = :stderr
# 非推奨の例外を報告する。
config.active_support.disallowed_deprecation = :raise
# 非推奨の警告を許可しないようにするか
config.active_support.disallowed_deprecation_warnings = []
# i18n(internationalization: 国際化)ライブラリに沿って翻訳するかどうか
# config.i18n.raise_on_missing_translations = true
# レンダリングしているファイル名に注釈をつけるかどうか
config.action_view.annotate_rendered_view_with_filenames = true
end
production.rbの中身詳細
production.rbとは、開発環境の設定を記述したファイルです。
require "active_support/core_ext/integer/time"
Rails.application.configure do
#ここでの設定はconfig/application.rbよりも優先する。
#キャッシュを使う。変更点を自動検知しリロードしない
config.cache_classes = true
#eager loadを行う。コピーを作成することでパフォーマンスを上げる。
# Rakeコマンドの時は無視する
config.eager_load = true
# フルのエラー報告行わない
config.consider_all_requests_local = false
# キャッシュを使う
config.action_controller.perform_caching = true
# masterキーがENV["RAILS_MASTER_KEY"]かconfig/master.key.のどちらかに存在していること。このキーは暗号解読に使う。
# config.require_master_key = true
# /publicから静的ファイルを提供しない(ApacheかNGINXが代替)
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
# CSSを圧縮する。
# config.assets.css_compressor = :sass
#プリコンパイルしたアセットがない場合代替に切り替えない
config.assets.compile = false
アセットサーバーから画像、スタイルシート、JSを提供する
# config.asset_host = 'http://assets.example.com'
# ファイル送信で使っているサーバーのヘッダーを指定する
# config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache
# config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX
# 一時ディレクトリのアップロードファイルを保存する
config.active_storage.service = :local
# Action Cableをメインサーバープロセスの一部としてマウントする場所を文字列で指定する
# config.action_cable.mount_path = nil
# Action Cableサーバーがメインアプリケーション以外か別ドメインの場合に使うサーバーのURLを指定する
# config.action_cable.url = 'wss://example.com/cable'
# config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ]
# SSLで通信を行うことを強制する
# config.force_ssl = true
# Railsのログ出力をどのぐらい詳細にするかを指定する。
# :infoは有用なログのみ残す。個人を特定できる情報の公開は避ける
config.log_level = :info
# すべてのログの前に以下のタグをつける(:request_id)
config.log_tags = [ :request_id ]
# 本番環境用の別のキャッシュストアを使う
# config.cache_store = :mem_cache_store
# アクティブジョブには実際のキューイングバックエンドを使用する(または、環境ごとに個別のキューを使用)
# config.active_job.queue_adapter = :resque
# config.active_job.queue_name_prefix = "rails6_docker_alpine_production"
config.action_mailer.perform_caching = false
# 不正なメールアドレスを無視し配信エラーを報告しない。
# config.action_mailer.raise_delivery_errors = false
# I18nのロケールフォールバックを有効にする(任意のロケールのルックアップをフォールバック)
config.i18n.fallbacks = true
# 登録済みのリスナーに非推奨通知を送信する
config.active_support.deprecation = :notify
# 許可されていない非推奨をログに記録
config.active_support.disallowed_deprecation = :log
# どの非推奨メッセージを禁止するかをActive Supportに伝える
config.active_support.disallowed_deprecation_warnings = []
# PIDとタイムスタンプが抑制されないように、デフォルトのログフォーマッターを使用
config.log_formatter = ::Logger::Formatter.new
# 分散セットアップには別のロガーを使用。"syslog/logger"をrequireで読み込む。
# config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name')
if ENV["RAILS_LOG_TO_STDOUT"].present?
logger = ActiveSupport::Logger.new(STDOUT)
logger.formatter = config.log_formatter
config.logger = ActiveSupport::TaggedLogging.new(logger)
end
# マイグレーション後にスキーマを削除しない
config.active_record.dump_schema_after_migration = false
# ミドルウェアを挿入して自動接続切り替えを実行します。
# `database_selector`ハッシュは、DatabaseSelectorにオプションを渡すために使用されます
# ミドルウェアの`delay`は、書き込み後の待機時間を決定するために使用されます
# 後続の読み取りをプライマリに送信します。
# `database_resolver`クラスは、ミドルウェアがどれを決定するために使用します
# データベースは、時間遅延に基づいて使用するのに適しています。
# `database_resolver_context`クラスは、ミドルウェアが設定するために使用します
# プライマリへの最後の書き込みのタイムスタンプ。リゾルバーはコンテキストを使用します
# クラスのタイムスタンプは、から読み取る前に待機する時間を決定します
# デフォルトでは、Railsはセッションに最後の書き込みタイムスタンプを保存します。
# DatabaseSelectorミドルウェアは、独自に定義できるように設計されています
# 接続スイッチングの戦略とそれをミドルウェアに渡す構成オプション。
# config.active_record.database_selector = { delay: 2.seconds }
# config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver
# config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session
end
参考リンク
configの設定内容はRailsの公式ページに記載があります。