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が無効になっている