ボクココ

個人開発に関するテックブログ

Ruby on Rails 5.1 から 5.2 へアップデートログ

ども、@kimihom です。

f:id:cevid_cpp:20190301214729j:plain

今回は 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 を追加する必要があった。その方法に関しては既に下記に記してある。

www.bokukoko.info

終わりに

Rails 4 -> 5 のような大きいアップデートとは違うので、ちょっとした修正で無事アップグレードを終えることができた。ちゃんとテストコードを書いて、気になるところは手動でテストもしっかりやったから安心である。

新しいプロジェクトだったら Action Cable とか Active Storage とか使うだろうけど、やっぱ前からあるプロジェクトだとわざわざ同じ機能を作り直したくはないよね。これらの技術に関しても追従できるように、定期的にちょっとしたサンプル Rails プロジェクトを作って遊んでみたいと思う。

今回のアップデートで Ruby の高速化・省メモリや ActiveRecord の高速化などに期待したいところだ。