LoginSignup
2
1

More than 1 year has passed since last update.

Rails4からRails5へのアップデート手順(Rails4.2.11→Rails5.2.6.2)

Last updated at Posted at 2022-07-24

Rails4からRails5へのアップデートメモ

今更ですが、rails4からrails7までアップデートする必要があったため
Rails4→Rails5
Rails5→Rails6
Rails6→Rails7
のアップデートで手順をまとめていきます。

ここではRails4→Rails5の手順を書いていきます。

事前準備

testが通るようにしておく

testを通るようにしておくと、アップデート後に、どこがエラーになるのか確認しやすいです。
事前にtestが全て通るようにしておきましょう。

ruby更新

rubyが2.5.7だと対応してないgemがいくつかあり、
gem updateでエラーが出たので2.7.5にupdateしました。

Railsをアップデート

gemfileの修正

gemのrailsのバージョンを変更する

変更前
gem 'rails', '4.2.11'
変更前
gem 'rails', '5.2.6.2'

railsのupdate

下記コマンドを実行してrailsをupdateします

bundle update rails

設定ファイル更新

以下のコマンドを実行して、Railsの設定ファイル等を更新します。

bundle exec rails app:update

問題なければ上書きして良いでが、
必ず差分を見ながら更新していきましょう。

bundle update

bundle updateを実行して
gemファイルの依存関係などでエラーがある場合は修正しておきます。

bundle update

Rails5のコードに修正

ActiveRecord::Base、ActiveJob::Baseの置き換え

Rails5.0以降ではモデルの継承先が下記のように変わりました。
使用箇所を一括置換しました。
ActiveRecord::Base → ApplicationRecord
ActiveJob::Base → ApplicationJob

model内一括置換
ActiveRecord::Base → ApplicationRecord


job内一括置換
ActiveJob::Base → ApplicationJob

config.middleware.useの修正

middlswareにダブルコーテーションを使ってるとエラーになりました

/config/environments/development.rb

修正前 
config.middleware.use "AssetHeaders"
修正後
config.middleware.use AssetHeaders

scopeの修正

scope のsize、withoutが使えないのでscope名を変更しました

修正前
scope :size, ->(width, height, depth) {
scope :without, ->(user_id) { where('user_id != :user_id', user_id: user_id) }
修正後
scope :set_size, ->(width, height, depth) {
scope :without_self, ->(user_id) { where('user_id != :user_id', user_id: user_id) }

FactoryGirlをFactoryBotに置換

gemの名前が変わったので一括置換

修正前
FactoryGirl.define do
修正後
FactoryBot.define do

acriverecord関連の修正

AcitveRecordsで取得した値を直接ハッシュに変更しようとするとエラーになったので修正

修正前
data = Master::Data.offset(0).limit(10)
data.each_with_index do |x, i|
    data[i] = x.attributes.symbolize_keys
end
修正後
tmp_data = Master::Data.offset(0).limit(10)
data = []
tmp_data.each_with_index do |x, i|
    data[i] = x.attributes.symbolize_keys
end

AcitveRecordsで取得した配列に、別な配列を追加できなかったのでmapで作り直した

修正前
data = Master::Data.all.order(:id)
修正後
data = Master::Data.all.order(:id).map{|v| {:id=>v[:id], :name=>v[:name]}}

この他に、おかしなbelogs_toを削除があると
データ登録ではじかれるようになったため修正しました

オートロード関連

productionでオートロードが無効化されたので
config/application.rbを下記に変更

変更前
config.autoload_paths += Dir["#{config.root}/lib"]

変更後
config.paths.add 'lib', eager_load: true

非推奨メソッドの修正

before_filterが非推奨になったので、before_actionに変更

修正前
before_filter :authorize
修正後
before_action :authorize

Relation#uniqが非推奨。Relation#distinctに変更

修正前
data = Player::Data.uniq
修正後
data = Player::Data.distinct

envの参照箇所修正

envからの直接参照ではなく、request.envになったので修正

修正前
device = view_context.http_host_device env["HTTP_HOST"]
修正後
device = view_context.http_host_device request.env["HTTP_HOST"]

render修正

render :text が廃止
render :plain に変更

修正前
render text: "OK"
修正後
render plain: "OK"

paramsの対応

params が hash ではなく、ActionController::Parametersに変更になった。
hashとマージしていたり、eachしていたら
params.to_unsafe_h でハッシュに変換する必要があります。

修正前
ret = {:test=>1} + params
修正後
ret = {:test=>1} + params.to_unsafe_h

まとめ

Rails4からRails5へのアップデート手順をまとめていきました。
修正箇所は多いですが、Rails5への修正箇所は
一括置換できる箇所が多かったので
テストがちゃんと書かれているか、アップデート前から正常に動いているかが肝になるのかなと思いました。
アップデート作業は初めて行ったので、まとまっていない部分もあるかと思いますが
どなたかの参考になればと思います。

参考

【Rails5】今更ながらRails4からRails5へのアップグレードをどうやっていくのが良いか調べてみた
Rails アップグレードガイド
Rails 5アップグレードへの道
Rails アップグレードガイド
Rails5 production環境ではautoloadが無効になっている

2
1
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
2
1