Railsバージョンアップ備忘録 5.0→5.1編

本エントリは [iCARE Advent Calender 2020](https://qiita.com/advent-calendar/2020/icare) の22日目です。

初めまして。株式会社iCAREのサーバーサイドエンジニアの[yotuba](https://twitter.com/yotuba_eng)です。
今回は会社のアドベントカレンダーということで、最近自分が仕事で行っているRailsのバージョンアップについて備忘録を書きたいと思います。

現在弊社のCarelyというサービスは、Railsの5.0.7.2で稼働しており、最近Railsは6.1が出たというニュースもありましたが、少しだけバージョンが古くなってきてしまっており、今回バージョンアップを弊社技術顧問の[willnet](https://twitter.com/netwillnet)さんと連携してやらせて頂いています。
（技術顧問の方がいるってなんて素晴らしいんだろう・・・）

着手し始めたばかりではありますが、今回の記事では、5.1.7へバージョンアップを現在しようとしている際にぶつかった問題や落ちたテストを共有させてもらえればと思います。

## 5.1.7へ上げた際に落ちたテストからわかる変更点
まずはブランチを切ってCIを回してみました。そうすると結構なテストの個数が落ちましたが、詳しく見てみると原因はいくつかに絞られました。

バージョンアップする際には、まず、こちらのRailsガイドの[リリースノート](https://railsguides.jp/5_1_release_notes.html)に書いてあるものなので、そちらを参考にして頂くのが一番良いと思います。

### render text
まず単純な記法です。renderする時に平文テキストをマークアップせずにブラウザに送信するために渡すオプションが:textではなく、:plainオプションを使用するように変更になりました。
render text: "hoge"
↓
render plain: "hoge"
に変更しました。

### 全角スペースを削除しようとしたコード
Rubyの[Strip](https://docs.ruby-lang.org/ja/latest/method/String/i/strip.html)というメソッドが文字列の前後の空白を削除することができますが、Trim（全角スペースやBOM）をしようとした時にどのようにすれば良いでしょうか？

ググると[こちら](http://shepherdmaster.hateblo.jp/entry/2016/07/18/180617)のブログが出てきます。
ActiveSupport::Multibyte::Unicode::LEADERS_PATとActiveSupport::Multibyte::Unicode::TRAILERS_PATをgsubして全角スペースやBOMなどを削除するコードです。

引用
```str.gsub(ActiveSupport::Multibyte::Unicode::LEADERS_PAT, '').gsub(ActiveSupport::Multibyte::Unicode::TRAILERS_PAT, '')
```

しかし5.0まではあった[こちら](https://api.rubyonrails.org/v5.0/classes/ActiveSupport/Multibyte/Unicode.html)が[5.1](https://api.rubyonrails.org/v5.1/classes/ActiveSupport/Multibyte/Unicode.html)からはなくなっているため、以後のRailsのバージョンでは動かなくなります。

RailsのAPIを使用しているコードの場合は、バージョンアップに伴いコード自体がなくなる場合もありますので、この辺りは調べて出てきた情報でも使用しているバージョンなどに注意したいですね。

### unable to convert unpermitted parameters to hash
許可されてないパラメータはハッシュにできません　というエラーです。
[こちら](https://github.com/rails/rails/pull/20868)

これがどのようなコードで起きたかというと、URLにパラメータを渡そうとしたコードです。

URLに渡すためには、hoge.[to_param](https://railsdoc.com/page/to_param)というメソッドを使っている部分がありましたが、このhogeに対して許可がされていないため、起きたエラーでした。（5.1から動かなくなるコードです）

なので、hoge内をpermitしてあげることにより、動くようになりました。


### request specでjsonを取得しようとするコード
request specでjsonのformatをリクエストして、返ってきたjsonをテストしたいという状況はあるはずです。

```
get hoge_path(hoge_id: hoge.id, :format => :json)
```

このようなコードがありましたが、:format => :json
という書き方が通らなくなってしまいました。

これは困ったな〜となった時にみるべきものは公式のドキュメントですね。
[こちら](https://relishapp.com/rspec/rspec-rails/v/4-0/docs/request-specs/request-spec)のRspecの公式ドキュメントを見てみましょう。
requesting a JSON response　というまさに！な場所がありました。
```headers = { "ACCEPT" => "application/json" }
```
headersを持たせたコードに変更して無事解決しました。

### redirect to :back が動かない
直前のページにリダイレクトさせたいコードで書かれていた
redirect_to :back　
が動かなくなりました。
こちらも調べるべきは[公式ドキュメント](https://railsdoc.com/page/redirect_back)です。
```redirect_back(HTTP_REFERERが設定されていない場合のリダイレクト先 [, オプション])
```
という書き方に変更して解決する音ができました。

### id の型が integer から big intに変更
デフォルトでidカラムはintで作成されますが、5.1からはこれがbigintに変更されました。[こちら](https://github.com/rails/rails/pull/27389)

型が違うと外部キー制約を貼れないため、5.1以降で新規にテーブルを作成したものと5.0以前で作成したもの（intとbigint）が混在すると問題が発生します。
弊社はBtoBのサービスであり、idの枯渇については高負荷サービスと比べると心配が少ないため、開発の工数などとの兼ね合いもあり、int型で作ることをそのまま維持する（migrationファイルを5.0で走らせれば良いだけです）ことを選択しました。


## 終わりに
いかがでしたでしょうか。
今回はバージョンアップの際の全てではなく、実際に動いているプロダクトで起きた問題に絞って記事を書かせてもらいました。


最後に、弊社ではエンジニアを絶賛大募集中です！
興味のある方は[こちら](https://www.wantedly.com/companies/iCARE/projects)から是非ご応募ください！


明日23日は[zouzei8to10](https://qiita.com/zouzei8to10)さんによる、【AdobeXDのコンポーネントで可変テキストのタブをつくる】です。
お楽しみに。