[Rails 5] Rails 5の新フレームワークデフォルト設定ファイルでアップグレード作業を軽減する

こんにちは、hachi8833です。BigBinaryシリーズ記事の第一弾をお送りします。

はじめに

シリーズをとおして、元記事の全文の逐字訳ではなく再構成した記事としますのでご了承ください。詳しくは元記事を参照いただくようお願いいたします。

元記事

確認に使った環境

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からのアップグレード中に確認しながら順々にfalsetrueにしますが、ここだけはtruefalseに変えることになるので、なかなかややこしいです。

参考: 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(生成)

参考

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の半分ほど、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れてそれぞれ一部を翻訳。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好き。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

週刊Railsウォッチ

インフラ

BigBinary記事より

ActiveSupport探訪シリーズ