0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-07-24

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

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

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

事前準備

testが通るようにしておく

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

Ruby Version

今回はRuby 2.7.5 で対応してます

gccのバージョンを確認しておく

mini_racerをインストールするためには、gcc6.3以上が必要になってきます。
今回centos7にはyum installで新しいバージョンを入れられなかったため
devtoolsetを使用してインストールしました。
詳細は後ほど記載します。

Railsをアップデート

gemfileの修正

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

変更前
gem 'rails', '5.2.6.2'

変更前
gem 'rails', '6.1.4.7'

railsのupdate

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

bundle update rails

設定ファイル更新

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

bundle exec rails app:update

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

bundle update

bundle updateを実行して
gemファイルの依存関係などでエラーがある場合は修正しておきます。
今回、therubyracerが更新されなくなっていたので
mini_racerに変更しました。

bundle update
修正前
gem 'therubyracer', platforms: :ruby
修正後
gem 'mini_racer', '0.3.1', platforms: :ruby

dalli_storeからmem_cache_storeに変更

:dalli_store が使えなくなったので :mem_cache_store を使うように修正

/config/environments/*  の各ファイル

dali_store の読み込み箇所をコメントアウト
#require 'action_dispatch/middleware/session/dalli_store'

修正前
config.cache_store = :dalli_store
修正後
config.cache_store = :mem_cache_store 

DEPRECATION WARNING関連の修正

DEPRECATION WARNING: Initialization autoloaded the constants が出てしまうので修正

/config/initializers/requirements.rb

修正前
Dir[Rails.root.join("app/models/**/*.rb")].sort.each { |f| require_dependency f }
修正後
Rails.application.config.after_initialize do
  Dir[Rails.root.join("app/models/**/*.rb")].sort.each { |f| require_dependency f }
end

/config/initializers/current_revision_loader.rb

修正前
ToUtil::Log::Revision.load_current_revision
修正後
Rails.application.config.after_initialize do
  ToUtil::Log::Revision.load_current_revision
end

DEPRECATION WARNING: Calling << to an ActiveModel::Errors message array in order to add an error is deprecated. Please call ActiveModel::Errors#add instead.
を修正

修正前
record.errors[attribute] << I18n.t('activerecord.errors.validate_error') unless ret
修正後
record.errors.add attribute, I18n.t('activerecord.errors.validate_error') unless ret

zeitwerkの導入

autoloader を zeitwerk に変更
rails7からはzeitwerkになるため、今回変更しておきました。

/config/application.rb

変更前
config.paths.add 'lib', eager_load: true
config.paths.add 'lib/ext', eager_load: true
config.paths.add 'app/validators', eager_load: true
変更後
config.autoloader = :zeitwerk
# 自動で読み込みたいファイルをlib/autoloder以下に設置
config.eager_load_paths << Rails.root.join("lib/autoloder")

zeitwerk はファイル名からクラス名を生成しているので、
命名規則に沿っていないとエラーになります。
下記コマンドを実行して、命名規則エラーがないかチェックし、
エラーがある場合は修正します。

bin/rails zeitwerk:check

deploy時のwarning修正

bundle install 時に flag is deprecatedが 発生するので修正

/config/deploy.rb

set :bundle_flags,      '--quiet' # this unsets --deployment, see details in config_bundler task details
set :bundle_path,       nil
set :bundle_without,    nil


# flag is deprecatedの対応
desc 'Config bundler'
task :config_bundler do
  on roles(/.*/) do
    within release_path do
      execute :bundle, :config, '--local deployment true'
      execute :bundle, :config, '--local without "development test"'
      execute :bundle, :config, "--local path #{shared_path.join('bundle')}"
    end
  end
end

まとめ

Rails5からRails6へのアップデート手順をまとめていきました。
今回はzeitwerkへの対応が面倒だと感じました。
アプリ内ではlib配下に共通ライブラリやバッチから呼ばれるソースコードを置いていたので
自動で読み込まれて欲しいものとそうでないものを切り分け、ディレクトリを移動させました。

参考

bundle config で capistrano の flag is deprecated に対応する
Ruby on Rails 6の主要な新機能・機能追加・変更点
定数の自動読み込みと再読み込み (Zeitwerk)
Rails アップグレードガイド
Rails 5 から Rails 6 へアップデートした際の手順

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?