Rails 5.1.6 を 5.2.1 にアップデート
概要
Rails 5.1.6 のアプリを 5.2.1 にアップデートしたのでメモ。
手順
テストでしっかり保護しておいて、
gem の rails のバージョンを上げて、
bin/rails app:update
を実行する。
そして、config/initializers/new_framework_defaults_5_2.rb
のコメントアウトを一つずつ外し、動作確認し、
application.rb
の config.load_defaults 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
に変更しました。