Railsのconfig/enviroments配下を読んでみる

## 目的
* config/enviroments/配下のパラメータよくわからないまま何となくコピペしており、ちゃんと一つ一つの設定の意味を理解してみようと思った。
* development/test/productionの差分がどんな感じなのか知りたい。

## 前提
* versionは5.1.0.rc1
* 読むのはrails newした初期状態です。

## 参考
* [RailsGuides](https://railsguides.jp/configuring.html)


## 一覧

|設定|development|test|production|
|:---|:---|:---|:---|
|config.action_dispatch.show_exceptions|-|false|-|
|config.action_mailer.raise_delivery_errors|false|-|-|
|config.action_mailer.perform_caching|false|false|false|
|config.action_mailer.delivery_method|-|:test|-|
|config.active_support.deprecation|:log|:stderr|:notify|
|config.active_record.migration_error|:page_load|-|-|
|config.active_record.dump_schema_after_migration|-|-|false|
|config.action_controller.perform_caching|true or false|false|true|
|config.cache_store|:memory_store or :null_store|-|-|
|config.public_file_server.headers|{ 'Cache-Control' => 'public, max-age=172800' } or nil|{ 'Cache-Control' => 'public, max-age=3600' }|-|
|config.action_controller.allow_forgery_protection|-|false|-|
|config.assets.js_compressor|-|-|:uglifier|
|config.assets.compile|-|-|false|
|config.assets.debug|true|-|-|
|config.assets.quiet|true|-|-|
|config.cache_classes|false|true|true|
|config.consider_all_requests_local|true|true|false|
|config.eager_load|false|false|true|
|config.file_watcher|ActiveSupport::EventedFileUpdateChecker|-|-|
|config.i18n.fallbacks|-|-|true|
|config.log_level|-|-|:debug|
|config.log_tags|-|-|[ :request_id ]|
|config.log_formatter|-|-|::Logger::Formatter.new|
|config.logger|-|-|ActiveSupport::TaggedLogging.new(logger)|
|config.public_file_server.enabled|-|true|ENV['RAILS_SERVE_STATIC_FILES'].present?|
|config.read_encrypted_secrets|-|-|true|

## config.action_dispatch.show_exceptions
```
アプリケーションから返されるすべての例外をrescueし、リクエストがローカルであるかconfig.consider_all_requests_localがtrueに設定されている場合に適切な例外ページを出力します。config.action_dispatch.show_exceptionsがfalseに設定されていると、常に例外が出力されます。
```
* testだけ `false`
* rescueされていない例外をあぶり出すためかな。

## config.action_mailer.raise_delivery_errors
```
メールの配信が完了しなかった場合にエラーを発生させるかどうかを指定します。デフォルトはtrueです。
```
* developmentだけ `false`
* メール配信のテストとかはdevelopment以外でやれってことかな

## config.action_mailer.perform_caching
```
Action Mailerのビューでキャッシュをサポートするかどうかを指定できます。
```
* 全環境 `false`
* メールテンプレートのキャッシュをするかしないか。
* まあ負荷とか懸念があったらやれってことかね。

## config.action_mailer.delivery_method
```
配信方法を指定します。デフォルトは:smtpです
```
* testだけ `:test`
* テスト時はテスト配信ね。

## config.active_support.deprecation
```
active_support.deprecation_behavior: 環境に対する非推奨レポート出力を設定します。development環境ではデフォルトで:log、production環境ではデフォルトで:notify、test環境ではデフォルトで:stderrが指定されます。config.active_support.deprecationに値が設定されていない場合、このイニシャライザは、現在の環境に対応するconfig/environmentsファイルに値を設定するよう促すメッセージを出力します。値の配列を設定することもできます。
```

* これはそのまま非推奨レポートをどこに出すかだな。

## config.active_record.migration_error
* RailsGuideにないな・・・
* ググったら、未適応のmigrationがあるときにエラーを投げるかどうか
* developmentだけ `:page_load`
* 説明が[ソース](https://github.com/rails/rails/blob/master/activerecord/lib/active_record/migration.rb#L542-L543)のコメントしか無い

```
This class is used to verify that all migrations have been run before
loading a web page if <tt>config.active_record.migration_error</tt> is set to :page_load
```

* `:page_load` を設定しておくと、ウェブページを読み込む前に未適応のmigrationをチェックするってことか。

## config.active_record.dump_schema_after_migration
```
マイグレーション実行時にスキーマダンプ(db/schema.rbまたはdb/structure.sql)を行なうかどうかを指定します。このオプションは、Railsが生成するconfig/environments/production.rbではfalseに設定されます。このオプションが無指定の場合は、デフォルトのtrueが指定されます。
```

* これもそのままだね。

## config.action_controller.perform_caching|
```
アプリケーションでキャッシュを行なうかどうかを指定します。developmentモードではfalse、productionモードではtrueに設定します。
```

* developmentは `Rails.root.join('tmp/caching-dev.txt').exist?` の判定有り。
* `tmp/caching-dev.txt` をおいたらキャッシュ有効だね。


## config.cache_store
```
Railsでのキャッシュ処理に使用されるキャッシュストアを設定します。指定できるオプションは次のシンボル:memory_store、:file_store、:mem_cache_store、:null_storeのいずれか、またはキャッシュAPIを実装するオブジェクトです。tmp/cacheディレクトリが存在する場合のデフォルトは:file_storeに設定され、それ以外の場合のデフォルトは:memory_storeに設定されます。
```

* developmentは `Rails.root.join('tmp/caching-dev.txt').exist?` の判定有り。
* `tmp/caching-dev.txt` をおいたら `memory_store` なかったら `null_store `
* productionは `memory_store`
* `memory_store` はメモリにキャッシュする。
* `null_store` はキャッシュを全く保存しない。([参考](https://railsguides.jp/caching_with_rails.html)) 


## config.action_controller.allow_forgery_protection
```
CSRF保護をオンにするかどうかを指定します。testモードではデフォルトでfalseに設定され、それ以外ではtrueに設定されます。
```

* これもそのまま。
* テストのときはCSRF保護してたらアクセスできなかったりするから？

## config.assets.js_compressor
```
JavaScriptの圧縮に使用するプログラムを定義します。指定できる値は:closure、:uglifier、:yuiです。それぞれclosure-compiler、uglifier、yui-compressor gemに対応します。
```

* productionだけ `:uglifier` (入れないかもしれん。入れないと・・・)
* assets配下のjavascriptに対する設定かな。



## config.assets.compile
```
production環境での動的なSprocketsコンパイルをオンにするかどうかをtrue/falseで指定します。
```

* productionだけ `false`
* 使いたいときはtrueにしろってことで、あえてproductionにだけfalseで書いてあるのかな。


## config.assets.debug
```
デバッグ用にアセットの連結と圧縮をやめるかどうかを指定します。development.rbではデフォルトでtrueに設定されます。
```

* developmentだけ `true`
* debug用だからね。

## config.assets.quiet
* 説明無し。
* developmentだけ `true`
* ググったら `assets関連のログを出さないようにする` っぽい。
* 開発ではassetsへのアクセスログで埋め尽くされて見えなくの嫌なので。


## config.cache_classes
```
アプリケーションのクラスやモジュールをリクエストごとに再読み込みするか(=キャッシュしないかどうか)どうかを指定します。config.cache_classesのデフォルト値は、developmentモードではfalseなのでコードの更新がすぐ反映され、testモードとproductionモードではtrueなので動作が高速になります。同時にthreadsafe!をオンにすることもできます。
```

* なるほどそのままでよくわかる。


## config.consider_all_requests_local
```
このフラグがtrueの場合、どのような種類のエラーが発生した場合にも詳細なデバッグ情報がHTTPレスポンスに出力され、アプリケーションの実行時コンテキストがRails::Infoコントローラによって/rails/info/propertiesに出力されます。このフラグはdevelopmentモードとtestモードではtrue、productionモードではfalseに設定されます。もっと細かく制御したい場合は、このフラグをfalseに設定してから、コントローラでlocal_request?メソッドを実装し、エラー時にどのデバッグ情報を出力するかをそこで指定してください。
```

* これもそのままでよくわかる。


## config.eager_load
```
config.eager_loadをtrueにすると、config.eager_load_namespacesに登録された事前一括読み込み(eager loading)用の名前空間をすべて読み込みます。ここにはアプリケーション、エンジン、Railsフレームワークを含むあらゆる登録済み名前空間が含まれます。
```

* productionだけ `true`
* 名前空間を事前に読み込んでおくための設定か。

## config.file_watcher
```
config.reload_classes_only_on_changeがtrueの場合にファイルシステム上のファイル更新検出に使用されるクラスを指定します。ActiveSupport::FileUpdateChecker APIに従う必要があります。
```

* developmentだけ `ActiveSupport::EventedFileUpdateChecker`
* でも `config.reload_classes_only_on_change` は未定義。

### (ついでに)config.reload_classes_only_on_change
```
監視しているファイルが変更された場合にのみクラスを再読み込みするかどうかを指定します。デフォルトでは、autoload_pathで指定されたすべてのファイルが監視対象となり、デフォルトでtrueが設定されます。config.cache_classesがオンの場合はこのオプションは無視されます。
```

* つまりファイルをキャッシュしておくかどうかってことかな

## config.i18n.fallbacks
* 説明無し。
* productionのみ `true`
* ググったら以下でてきた

```
データベースのすべてのレコードを2言語に翻訳するのは手間のかかる作業です。前に見たように、現在の言語に翻訳されていない属性にはnilの値が返されますが、フォールバック言語を設定することで、現在の言語で翻訳が存在しない場合にそれを表示させることが可能です。これをおこなうにはアプリケーションの設定ファイルを修正して、i18n.fallbacksオプションを追加します。

これによって、現在の言語で設定されていない翻訳はデフォルトのロケール(今回の場合は英語)にフォールバックします。この変更を反映するためにアプリケーションを再起動するしてページをリロードすると、Wookieespeakに翻訳テキストがない部分は代わりに英語で表示されます。
```

* フォールバック言語を指定できるってことか。
* これは使えるかも・・・



## config.log_level
```
Railsのログ出力をどのぐらい詳細にするかを指定します。デフォルトでは:debugが指定されます。productionモードのみデフォルトで:infoが指定されます。
```

* え？productionは `:debug` なんだが・・・
* 4.2.7も `:debug` てなってるぞ・・・
* Railsドキュメントには `:info` って書いてある。
* どうなってんだ・・・とりあえず `:info` にしておいたほうがよさそうだな
* 指定なしの時で、productionモードなら `:info` になる、ってことか？！


## config.log_tags
```
requestオブジェクトが応答するメソッドのリストを引数に取ります。これは、ログの行にデバッグ情報をタグ付けする場合に便利です。たとえばサブドメインやリクエストidを指定することができ、これらはマルチユーザーのproductionモードアプリケーションをデバッグするのに便利です。
```

* productionのみ `[ :request_id ]`
* ログの前にリクエストのIDを出してくれるってことかね。


## config.log_formatter
```
Railsロガーのフォーマットを定義します。このオプションは、デフォルトではActiveSupport::Logger::SimpleFormatterのインスタンスを使用します。ただしproductionモードの場合のみLogger::Formatterがデフォルトになります。
```

* ログのフォーマット定義ね。


## config.logger
```
ロガーを指定します。指定されるロガーは、Log4rまたはRubyのデフォルトのLoggerクラスのインターフェイスに従います。デフォルトではActiveSupport::Loggerのログが指定されます。これはproductionモードでは自動的にログを出力します。
```

* こっちはロガーの定義か。


## config.public_file_server.enabled
* 説明無し。
* nginxとかのWebサーバーを使わずにassetsを配信するらしい
* testは `true`
* productionは `ENV['RAILS_SERVE_STATIC_FILES'].present?`
* スタティックファイルがあるときは環境変数に入れておけば良いのか。


## config.public_file_server.headers
* 説明無し。
* 上記 `config.public_file_server.enabled` が `true` の時のヘッダを定義するだけっぽい。 


## config.read_encrypted_secrets
* 説明無し。
* これは5.1.0のEncrypt Secretsにあるsecret fileを読むか読まないかの設定だね。