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

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

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

ここでは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へのアップグレードをどうやっていくのが良いか調べてみた](https://qiita.com/himrock922/items/0e98e6bd7a50fdb4ed33)
・[Rails アップグレードガイド](https://qiita.com/k0kubun/items/80c5a5494f53bb88dc58)
・[Rails 5アップグレードへの道](https://kenchan0130.github.io/post/2020-07-07-1)
・[Rails アップグレードガイド](https://railsguides.jp/upgrading_ruby_on_rails.html)
・[Rails5 production環境ではautoloadが無効になっている](https://onox.dev/rails5-production-autoload-disable/)