LoginSignup
3
2

More than 5 years have passed since last update.

Rails4.2 -> 5.2 バージョンアップした話

Posted at

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

上書きの際には確認をしてくるのでいきなり消えたりはしませんが、必ずバックアップして以前の情報も参照できるようにしてください。

その他・まとめ

あとは動作確認しながら出たら都度潰す感じなのですが、一旦ここまで対処して動かすと以前と同じように&気持ちパフォーマンスが上がった気がします。本記事がお役に立てれば嬉しいです。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2