kawabatas技術ブログ

試してみたことを書いていきます

Rails 5.1.6 を 5.2.1 にアップデート

概要

Rails 5.1.6 のアプリを 5.2.1 にアップデートしたのでメモ。

手順

Rails アップグレードガイド

テストでしっかり保護しておいて、

gem の rails のバージョンを上げて、

bin/rails app:updateを実行する。

そして、config/initializers/new_framework_defaults_5_2.rbコメントアウトを一つずつ外し、動作確認し、

application.rbconfig.load_defaults 5.2 にする。

修正した箇所

Ruby on Rails 5.2 リリースノート

gem bootsnap 追加

bin/rails sで起動時にエラーになりました。

Ruby on Rails 5.2 リリースノート

bootsnapをデフォルトのGemfileに追加。

Gemfile に gem 'bootsnap', require: false 追加しました。

system_test の設定追加

システムテストがこけるようになりました。

Ruby on Rails 5.2 リリースノート

システムテストで、ユーザーが別のサーバーを手動でしていない場合にのみPumaをデフォルトのサーバーとして設定するように変更。

こちらの影響で Capybara の server_host が 127.0.0.1 になり、アクセスできなくなっていたっぽいです。以下に変更。

class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
  Capybara.configure do |config|
    config.server_host = '0.0.0.0'
  end
  driven_by :selenium, using: :chrome, screen_size: [1400, 1400], options: { url: 'http://chrome:4444/wd/hub' }
  setup do
    host! "http://#{IPSocket.getaddress(Socket.gethostname)}"
  end
end

redis_cache_store に変更

Rails 5.2 に Redis キャッシュストアが組み込まれたので、gem redis_railsを取り除き、設定を変更しました。

変更前

config.cache_store = :redis_store, { url: ENV['REDIS_URL'], namespace: 'cache', expires_in: 90.minutes }

変更後

config.cache_store = :redis_cache_store, { url: ENV['REDIS_URL'], namespace: 'cache', expires_in: 90.minutes }

hash に関すること

Ruby on Rails 5.2 リリースノート中のどれが影響したのか、特定できなかったのですが、DB のカラムに hash の配列を保存しているところのテストがこけました。※このDBの設計に関しては見直そうと話してはいます。

具体的には、A テーブルに hash の配列を保存する a カラムがあったとすると、

Rails 5.1.6 では、キーが文字列になっていたのですが、

pry(main)> a = A.create(a: [{'key1': 1, 'key2': 2}])
=> #<
id: nil,
a: [{"key1" => 1, "key2" => 2}]> # キーが文字列になっている

Rails 5.2.1 では、キーがシンボルになり、エラーになる箇所が出てきました。

pry(main)> a = A.create(a: [{'key1': 1, 'key2': 2}])
=> #<
id: nil,
a: [{:key1 => 1, :key2 => 2}]> # キーがシンボル

リリースノート中によく出てきたHashWithIndifferentAccessを使って、キーがシンボルでも文字列でもアクセスできるようにして対応することにしました。

pry(main)> a = A.create(a: [{'key1': 1, 'key2': 2}.with_indifferent_access])
=> #<
id: nil,
a: [{"key1" => 1, "key2" => 2}]> # キーが文字列になっている

Rails.application.config.action_dispatch.use_authenticated_cookie_encryption = true

暗号化または署名付きcookieに有効期限情報が付与されました

AEAD暗号化cookieとセッションにGCMを追加。 (Pull Request)

cookies and sessions の暗号化方式が変わったようですが、僕のアプリでは再度認証してもらえばいいだけで、問題ありませんでした。

Rails.application.config.active_support.use_sha1_digests = true

SHA-1はETagヘッダーなどの重要度の低いダイジェストの生成に使うようになった。 (Pull Request, Pull Request)

Digest::MD5 -> ActiveSupport::Digest に変更しました。