Steps to Upgrade Rails

Posted by Anthony Chao on 2023-03-27

前陣子升級了公司專案的 Rails 版本,寫個文章記錄一下

升級 Rails 的步驟可以參考社群給的 Guide

升級前最低要求:test coverage 要完整,否則根本不知道上線之後哪裡會爆掉,而且可能很多小細節是 QA 測不出來的

Step1: Update Rails version

因為相伴隨有很多 dependencies 所以無法單純用 bundle update rails,要找到相對應所有會卡 dependency 的 gem 來一起做升級

ex.

1
bundle update rails actionpack actionview activemodel activerecord activesupport railties sprockets thor bundler-audit

Step2: Update Rails version

升級完之後,可以跑一個 rake 幫忙產生需要的檔案

1
rails app:update

他主要會產生 config/initializers/new_framework_defaults_X.Y.rb 這樣的一個檔案,並把一些你會需要自己設定的參數放在檔案中,這時候就要了解每個參數的意義再去設定成你要的值

我們的作法是最後拔除這個檔案,把需要 overwrite 的設定放回 config/application.rb 或者 config/environments/<environment>.rb 裡面,如果是符合新版本的預設設定就不特別寫

另外這個 rake 也可能不只產生這個檔案,像是我這次升級 Rails6.1,ActiveStorage 就有一個相關的 migration 需要執行,他也會自動生成 migration 檔案

Step3: Fix tests

開始修 spec 通常才是最花時間的地方,以下列出一些在這次升級時遇到的一些問題

Issues

  1. 一些 gem 也需要跟著升級,但 dependency 沒有更新到,包括cancancan 需要升級, paper trail 需要升級
  2. meta request 這個 gem 造成 stack level too deep,因為這個 gem 提供的功能目前團隊內沒有人使用因此直接拔除
  3. 有個 action text 相關的 controller spec 升級後過不了,結果改成 request spec 就過了,可能是跟 這個 有關
  4. Rails6.1 在 error message 處理的改動比較多,所以需要修改滿多地方的,詳細可看 這篇
  5. 隨著 Multi Tenant 架構的調整
  6. 搭配 Apartment gem 的使用,造成偵測到 rails_admin 的 source code 有 sql injection,需要用 patch 去改 rails_admin 的 source code




prevent_hack