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

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

今更ですが、rails４からrails7までアップデートする必要があったため
[Rails4→Rails5](https://qiita.com/t_mapico/items/ddf423113225ac45b033)
Rails5→Rails6
[Rails6→Rails7](https://qiita.com/t_mapico/items/6f586842c15b33db3422)
のアップデートで手順をまとめていきます。

ここでは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 に対応する](https://blog.yukii.work/posts/2020-04-09-fix-capistrano-bundler-deprication-warning/#gsc.tab=0)
・[Ruby on Rails 6の主要な新機能・機能追加・変更点](https://qiita.com/ryohashimoto/items/622c3bcfb3336cb9317e)
・[定数の自動読み込みと再読み込み (Zeitwerk)](https://railsguides.jp/autoloading_and_reloading_constants.html)
・[Rails アップグレードガイド](https://railsguides.jp/upgrading_ruby_on_rails.html)
・[Rails 5 から Rails 6 へアップデートした際の手順](https://nekonenene.hatenablog.com/entry/update-from-rails5-to-rails6)