先日2018/3/20にRails 5.2.0 RC2がリリースされました。公式記事によると、2018/4/17-19に開催されるRailsConf 2018までには正式版の5.2.0がリリース出来るように進めており、何も無ければRC2が最後のRelease Candidateになるようです。今からRailsアプリケーションの開発を開始する場合等はRC2からもう進めてしまうことをオススメしているのでこのタイミングで何が変わるのか現在5.1の実験アプリよりアップグレードして調査してみます。
(2019/2/14追記)
Rails 5.2.2まで現在はリリースされていますので他のプロジェクトでも上げた時の差分も追加して記載しておきます。
目次
スポンサーリンク
Rails5.2の新機能
ざっくりとRails5.2ではどういった新機能があるのかまとめておきます:
- Active Storage
- Amazon S3、Google Cloud Storage、Microsoft Azure Storage等のクラウドストレージへのアップロードとActive Recodeへの紐付けを行う
- Redis Cache Store
config.cache_store = :redis_cache_store
によってCache StoreにRedisをRails組み込みで指定された設定をすることで指定出来る様になる
- HTTP/2 Early Hints
- HTTP 103 EarlyHintsを用いたサーバプッシュが行えるようになる
- Content Security Policy
Content-Security-Policy
というHTTPヘッダを指定することでセキュリティポリシーをブラウザ側に伝えてそれらに則ってブラウザ側で脆弱性強化を行える仕組みが追加されたようです。Railsではそれらをアプリ全体、または個別に指定出来るDSLが追加されている
- Credentials
- アプリに必要な機密情報を1つのマスターキーで暗号化・管理できる仕組みが追加された
いずれも必要なアプリでは手動で仕組みを組み込んで実装していたものばかりそうで便利そうです。機会があれば詳細については別記事で取りあげてみたいと思います。
それでは実際に5.1→5.2にアップグレードして何が起こるか確認してみます。
Railsアップデート (5.1.5→5.2.2)
例の如く、実験アプリを5.2.0.rc2にアップデートしてみます(Railsアップデート (5.1.5→5.2.0.rc2) · web-k/tiramisu@58a7ea6)。RC版は単にbundle update
では上がらないのでGemfileにバージョン指定してから実行します:
gem 'rails', '5.2.0.rc2'
(2019/2/14追記)
現在は5.2.2まで公開されていますのでGemfileで5.2系でアップデート出来るように記載してアップデートします:
gem 'rails', '~> 5.2.0'
$ bundle update
次は設定ファイル等の更新をします:
$ rails app:update
ガイダンスに従って競合した設定ファイルを上書きするのか更新しないのかをチェックしていきます。今回のアプリではroutes.rbの自分で定義したDSLが消されてしまうのでこれのみ上書きしないであとは全て上書き出来ました。
これで設定ファイルの準備が整ったので実際に起動してみると、いくつかエラーがでました。
bootsnapの追加
config/boot.rb:4:in `require': cannot load such file -- bootsnap/setup (LoadError)
bootsnapはRailsの起動を高速化するgemのようでRails5.2で追加されたようです。こちらもGemfileに追加して再度bundle install
します:
gem 'bootsnap', require: false
これで起動可能になりました。
Cookie暗号化方法の変更
また、実際にアプリ操作を行ってみるとセッションデータのCookie暗号化方法が変更されました:
diff --git a/config/initializers/cookies_serializer.rb b/config/initializers/cookies_serializer.rb
index 1389e86..5a6a32d 100644
--- a/config/initializers/cookies_serializer.rb
+++ b/config/initializers/cookies_serializer.rb
@@ -2,4 +2,4 @@
# Specify a serializer for the signed and encrypted cookie jars.
# Valid options are :json, :marshal, and :hybrid.
-Rails.application.config.action_dispatch.cookies_serializer = :marshal
+Rails.application.config.action_dispatch.cookies_serializer = :json
無停止でアプリを更新する場合はパースエラーが出ない様にセッションを一旦リセットするなどの対応が必要になる可能性があるので気にしておいた方が良いです。
Modelのvalidateオプションのifで利用している文字列フィルタの修正
Rails 5.2ではvalidateで利用しているif条件指定時に文字列で記載可能でしたがこれは以前からdeprecatedで今回のバージョンで削除されたのでアロー演算子として書き直しました:
validates :email,
format: { with: /A[w+-.]+@[a-zd-.]+.[a-z]+z/i },
- if: 'email.present?'
+ if: -> { email.present? }
Rails 5.1→5.2のアップグレードなら簡単
5.1→5.2のアップデートは互換性も高く比較的簡単そうな印象です。新機能に関しても取り入れられるように早く理解してキャッチアップしていきたいですね:)