こんにちは、hachi8833です。BigBinaryシリーズ記事の第一弾をお送りします。
はじめに
シリーズをとおして、元記事の全文の逐字訳ではなく再構成した記事としますのでご了承ください。詳しくは元記事を参照いただくようお願いいたします。
元記事
確認に使った環境
- Rails 5バージョン: 5.0.1(5-0-stable)
- Rubyバージョン: 2.4.0p0
- Rails 4バージョン: 4.2.7(4-2-stable)
- Rubyバージョン: 2.3.3
Rails 5の新しいフレームワークデフォルト設定ファイルでアップグレード作業を軽減する
※Rails 5へのアップグレードの詳細な手順については本記事では省略いたします。詳しくはRailsアップグレードガイドなどをご覧ください。
new_framework_defaults.rbについて
Rails 5でrails new
すると生成されるconfig/initializers/new_framework_defaults.rbファイルは、Rails 5の新機能のオン/オフに使われます。この場合Rails 5の新機能はオンになります。
このファイルの冒頭に以下の記述があることからわかるように、Rails 5.0へのアップグレード作業を軽減するために導入されたものです。
This file contains migration options to ease your Rails 5.0 upgrade.
Rails 5へのアップグレードでは、Gemfileとrubygemのバンドリングを更新するといった作業のほかに、この新しいデフォルト設定ファイルについても配慮が必要です。
bin/rails app:update
で生成したnew_framework_defaults.rbはRails 4のアップグレードとRails 5で異なる
config/initializers/new_framework_defaults.rbファイルはRails 4以下のアプリにはないので、アップグレード作業中にbin/rails app:update
を実行してこのファイルを生成する必要があります。このコマンドでは他にも多数のconfig/やbin/以下のファイルが生成・更新・置換されます。
Rails 5へのアップグレード中に上のコマンドで生成したconfig/initializers/new_framework_defaults.rbファイルでは、rails new
した場合と異なり、Rails 5の新機能はオフに設定されますので、これらの新機能がRails 4アプリの機能に影響せずに済みます。
実行後、新機能を確認しながら新機能を順次オンにすることで、アップグレード作業がやりやすくなります。
参考: new_framework_defaults.rbの設定項目
以下は本記事執筆時に確認した、Rails 4からのアップグレード中に生成されたnew_framework_defaults.rbの項目です。ファイルの冒頭に記載されているとおり、Railsアプリを再起動しないと有効になりません。
これらの設定項目はRailsガイド: 2.19 フレームワークの新しいデフォルト設定にも記載されていますが、生成したnew_framework_defaults.rbではRails.application.
をつけたフルパスになっています。
Rails.application.config.action_controller.per_form_csrf_tokens
- フォーム単位でのCSRFトークンを有効にする
- Rails 4からのアップグレードでは
false
、Rails 5ではtrue
Rails.application.config.action_controller.per_form_csrf_tokens = false # Rails 4以前
Rails.application.config.action_controller.forgery_protection_origin_check
- CSRFを軽減するorigin-checkを有効にする
- Rails 4からのアップグレードでは
false
、Rails 5ではtrue
Rails.application.config.action_controller.forgery_protection_origin_check = false # Rails 4以前
ActiveSupport.to_time_preserves_timezone
- Ruby 2.4で
to_time
を呼んだときにレシーバのtimezoneを変えないようにする - Rails 4からのアップグレードでは
false
、Rails 5ではtrue
ActiveSupport.to_time_preserves_timezone = false # Rails 4以前
Rails.application.config.active_record.belongs_to_required_by_default
belongs_to
アソシエーションをデフォルトで必須にする- Rails 4からのアップグレードでは
false
、Rails 5ではtrue
Rails.application.config.active_record.belongs_to_required_by_default = false # Rails 4以前
ActiveSupport.halt_callback_chains_on_return_false
true
にすると、コールバックでfalse
が返された場合にコールバックチェーンを停止する(Rails 4との後方互換性のための設定)- Rails 4からのアップグレードでは
true
、Rails 5ではfalse
ActiveSupport.halt_callback_chains_on_return_false = false # Rails 4以前
Rails 5ではこのような場合にコールバックチェーンを停止しないのが基本なので、この項目は最終的にfalse
にする必要があります。
他の項目はRails 4からのアップグレード中に確認しながら順々にfalse
をtrue
にしますが、ここだけはtrue
をfalse
に変えることになるので、なかなかややこしいです。
参考: BigBinaryの別記事「Rails 5 does not halt callback chain when false is returned」でもこの設定項目について解説しています。
追加: Rails 5のrails new
で設定される項目
以下の項目は、Rails 5でrails new
したときにnew_framework_defaults.rbに含まれていました。私の環境でRails 4からアップグレードしたときには含まれていませんでした。
Rails.application.config.ssl_options
- SSLオプションでサブドメインでのHSTS(HTTP Strict Transport Security)を有効にする
- Rails 5では
true
(Rails 4以前は`false)
Rails.application.config.ssl_options = { hsts: { subdomains: true } } # Rails 5のみ
参考: bin/rails app:updateで更新されるファイルの例
Rails 4からRails 5へのアップグレード時にbin/rails app:update
で生成・更新されるファイルはアプリの内容や設定によって異なります。
以下は、私の手元のシンプルなRails 4環境で、アップグレード中にコマンドの対話にすべてyes
と入力した場合に追加・置換・更新・削除されたファイルです。実際には対話ごとにファイルを変更してよいかどうかを確認してください。
「置換」はファイル全体を置き換えたもの、「更新」は内容をgsub
で更新したものを指します。
- config/boot.rb(置換)
- config/routes.rb(置換)
- config/application.rb(置換)
- config/environment.rb(置換)
- config/secrets.yml(置換)
- config/cable.yml(生成)
- config/puma.rb(生成)
- config/spring.rb(生成)
- config/environments/development.rb(置換)
- config/environments/production.rb(置換)
- config/environments/test.rb(置換)
- config/initializers/application_controller_renderer.rb(生成)
- config/initializers/assets.rb(生成)
- config/initializers/backtrace_silencers.rb(変更なし)
- config/initializers/cookies_serializer.rb(生成)
- config/initializers/cors.rb(生成)
- config/initializers/filter_parameter_logging.rb(置換)
- config/initializers/inflections.rb(変更なし)
- config/initializers/mime_types.rb(置換)
- config/initializers/new_framework_defaults.rb(生成)
- config/initializers/session_store.rb(生成)
- config/initializers/wrap_parameters.rb(置換)
- config/locales/en.yml(置換)
- config/environments/development.rb(更新)
- config/initializers/cookies_serializer.rb(更新)
- config/cable.yml(変更なし)
- config/initializers/cors.rb(削除)
- bin/bundle(変更なし)
- bin/rails(置換)
- bin/rake(置換)
- bin/setup(生成)
- bin/update(生成)