ども、@kimihom です。
今回は Ruby と Ruby on Rails をそれぞれバージョンアップさせたので、そのログを記そうと思う。
アップデート概要
Ruby と Ruby on Rails をそれぞれアップデート。そろそろ Rails 6.0 も出そうなタイミングってこともあって、定期的にアップデートしないとすぐに取り残されちゃうね。
- Ruby 2.5.3 -> 2.6.1
- Ruby on Rails 5.1.6 -> 5.2.2
Ruby on Rails 5.2 リリースノート - Rails ガイド
関連 Gem のアップデート
Ruby 自体のアップデートは特に問題なく終わった。Rails を 5.2.2 にあげようとした時 Devise が依存関係で引っかかったので先にアップデート。
- Devise 4.4.1 -> 4.6.1
これで Rails 5.2 へアップグレードできた。いつも通りアップグレードのコマンドを実行。
bundle exec rails app:update
このコマンドで config
等で変わる差分を見ながらやっていく訳だけども、自分のプロジェクトでカスタマイズした config もあったのでひとまず 差分を見てエディタにコピっておいて、あとで一つずつマージする作業をしていった。そのほうが安全だね。
ソースコードの修正
bootsnap
っていうアプリ起動を効率化させる Gem を追記。
【アプリ起動時間を50%削減】Rails5.2からデフォルトGemに採用されたBootsnapを検証した · カウル Tech Blog
belongs_to
がデフォルトで required: true
になったようだ。has_many
な関係のモデルがあった時、親要素を指定する必要があるのがデフォルトになった様子。一部、モデルの親子関係で 親_id に nil
を許容するものがあったので、そこの部分を修正。
# belongs_to :user belongs_to :user, optional: true
SQLite を使っていると起動する度に警告が出てきたので、Arel を追記
eager_load(:user).order(Arel.sql("動的な Order 指定"))
Arel.sqlを付けるだけじゃダメ!? Railsで"Dangerous query method …”の警告が出たときの対応方法 - Qiita
安易に Arel つけて解決するんじゃねーぞという記事。自分の場合は完全にシステム側で文字の出し分けするだけだったので大丈夫だった。ユーザーの投稿内容を Arel 使ったりしたらそりゃあやばいよね。
ActiveStorage は使わない。
# config/application.rb +#require "active_storage/engine" # config/environments/production.rb + #config.active_storage.service = :local
Uglifier がなんかバグったので、ググって解決。
- config.assets.js_compressor = :uglifier + config.assets.js_compressor = Uglifier.new(harmony: true)
form_with
がデフォルトで remote: true
にならなくなった。ソースコードを読むと、どうやら form_with_generates_remote_forms
設定を読み込んでいるようだ。config/initializers/new_framework_defaults.rb
に追記。
+# Make `form_with` generate non-remote forms. +Rails.application.config.action_view.form_with_generates_remote_forms = true
factory_bot
もアップデートしたら、値の指定方法が {}
でくくらないといけなくなっていたので対応。
FactoryBot.define do factory :contact do - friendly_number "080-5352-3523" - name "Test Taro" + friendly_number {"080-5352-3523"} + name {"Test Taro"} end end
途中で気づいたこと
先ほど紹介したリリースノートを見ると、Rails 5.2 からRedis Cache Storeが組み込まれるようになったようだ。うちではすでに Redis をキャッシュストアと利用していたから、それがデフォルトで使えるようになった様子。
bin/yarn
ってコマンドが出てきて、Heroku のデプロイが簡単になったかなと思ったらそういうわけではなかった。引き続き buildpack に nodejs を追加する必要があった。その方法に関しては既に下記に記してある。
終わりに
Rails 4 -> 5 のような大きいアップデートとは違うので、ちょっとした修正で無事アップグレードを終えることができた。ちゃんとテストコードを書いて、気になるところは手動でテストもしっかりやったから安心である。
新しいプロジェクトだったら Action Cable
とか Active Storage
とか使うだろうけど、やっぱ前からあるプロジェクトだとわざわざ同じ機能を作り直したくはないよね。これらの技術に関しても追従できるように、定期的にちょっとしたサンプル Rails プロジェクトを作って遊んでみたいと思う。
今回のアップデートで Ruby の高速化・省メモリや ActiveRecord の高速化などに期待したいところだ。