Ruby on Railsはバージョン依存の影響を受け易いなという印象を持っているのですが、自分たちが作っているアプリケーションでも導入したいGemのバージョンとの相性を考慮して最新にする必要があると判断してバージョンを上げることにしました。
表題の通り4.2から5.2です。Deplicatedとかなっているものは容赦なくなくなったり、今まで動作上厳格を求めてなかったものが厳しくなるというのが主な違いでしょうか。とりあえずGem上のバージョンだけ上げて、 bundle install
したら全く動かなくて冷や汗かくみたいなところを繰り返してなんとか移行を完了させました。
以下その内容です。全てではありませんがポイントだけかいつまんでご紹介します。参考になれば幸いです。
進め方
4.2 → 5.0 → 5.1 → 5.2 のように段階的に上げよというのがRails的なオススメのようですが、以下を読みつつ一気に上げるのもできるんじゃないかと思ったりです。動かなけりゃどうするか確認するのは一緒だし。
ということでGemfileを大胆に変更して bundle install
とか bundle update
してエラーが出なくなるまでバージョンを調整かけるのを最初に行います。
並行して rails app:update
でconfigファイルの刷新を行います。操作間違えると今まであるファイルが一瞬にして消えてしまうのでバックアップもしくはgitで過去データを取っておいて差分比較しながら入れ替えたconfigファイルを直していきます。
その後は個別に rails s
で動作確認して挙動のおかしい箇所を直す感じです。
Gemfile
gem 'rails', '5.2.2' #単純に最新版にUP
gem 'mysql2', '>= 0.4.4' #このバージョンにしないと動かない
gem 'rmagick', '2.16.0' #最新は3.0.0だけど動かないので旧バージョンに戻す必要あり
あとはバージョン固定しているものは全部解除
Model
関連付けが存在しない場合、belongs_toでバリデーションエラーが発生することになったので、外部キーが設定されない可能性がある場合は
belongs_to :user, optional: true
みたいな感じにしておきます。また、Modelの継承元がApplicationRecordになるので
class Event < ApplicationRecord
というふうに書き換えます。これに対応するように以下のクラスも作成します。
class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true
end
Enum
Enumの定義も厳格になったぽく定義内容と実際のDBのテーブルの定義に乖離があると中身がnilになってしまうのでずれてないか確認する必要あります。
class InsertScript < ApplicationRecord
enum prev_or_next: {"prev": 1, "next": 2}
ちなみに私はこれでハマったのでもう定義ごと削除しました。
Controller
before_filter が完全に廃止された臭いのでbefore_actionに書き換えます。
- before_filter :set_locale
+ before_action :set_locale
OmniAuth
個人的には若干怪しいので書くべきか悩みましたが、OmniAuthもenv["omniauth.params"]["from"]のような環境変数でFacebookなどのサードパーティからのデータが取得できたものが、きちんとrequest.envと書かないといけなくなったようです。
- session[:redirect_after_fb_login] = env["omniauth.params"]["from"] if env["omniauth.params"].present? && env["omniauth.params"]["from"].present?
+ session[:redirect_after_fb_login] = request.env["omniauth.params"]["from"] if request.env["omniauth.params"].present? && request.env["omniauth.params"]["from"].present?
OmniAuthのコールバックを書いている箇所はこのように修正する必要があります。
Config Update
Config配下のファイルをまとめて5.2用にリプレースしてくれるツールがあるのでこれを使います。
rails app:update
これを流すと以下のファイルが書き換わります。
bin/bundle
bin/setup
bin/update
config/application.rb
config/boot.rb
config/cable.yml
config/environments/development.rb
config/environments/production.rb
config/environments/test.rb
config/puma.rb
上書きの際には確認をしてくるのでいきなり消えたりはしませんが、必ずバックアップして以前の情報も参照できるようにしてください。
その他・まとめ
あとは動作確認しながら出たら都度潰す感じなのですが、一旦ここまで対処して動かすと以前と同じように&気持ちパフォーマンスが上がった気がします。本記事がお役に立てれば嬉しいです。