本エントリは iCARE Advent Calender 2020 の22日目です。
初めまして。株式会社iCAREのサーバーサイドエンジニアのyotubaです。
今回は会社のアドベントカレンダーということで、最近自分が仕事で行っているRailsのバージョンアップについて備忘録を書きたいと思います。
現在弊社のCarelyというサービスは、Railsの5.0.7.2で稼働しており、最近Railsは6.1が出たというニュースもありましたが、少しだけバージョンが古くなってきてしまっており、今回バージョンアップを弊社技術顧問のwillnetさんと連携してやらせて頂いています。
(技術顧問の方がいるってなんて素晴らしいんだろう・・・)
着手し始めたばかりではありますが、今回の記事では、5.1.7へバージョンアップを現在しようとしている際にぶつかった問題や落ちたテストを共有させてもらえればと思います。
5.1.7へ上げた際に落ちたテストからわかる変更点
まずはブランチを切ってCIを回してみました。そうすると結構なテストの個数が落ちましたが、詳しく見てみると原因はいくつかに絞られました。
バージョンアップする際には、まず、こちらのRailsガイドのリリースノートに書いてあるものなので、そちらを参考にして頂くのが一番良いと思います。
render text
まず単純な記法です。renderする時に平文テキストをマークアップせずにブラウザに送信するために渡すオプションが:textではなく、:plainオプションを使用するように変更になりました。
render text: "hoge"
↓
render plain: "hoge"
に変更しました。
全角スペースを削除しようとしたコード
RubyのStripというメソッドが文字列の前後の空白を削除することができますが、Trim(全角スペースやBOM)をしようとした時にどのようにすれば良いでしょうか?
ググるとこちらのブログが出てきます。
ActiveSupport::Multibyte::Unicode::LEADERS_PATとActiveSupport::Multibyte::Unicode::TRAILERS_PATをgsubして全角スペースやBOMなどを削除するコードです。
引用
しかし5.0まではあったこちらが5.1からはなくなっているため、以後のRailsのバージョンでは動かなくなります。
RailsのAPIを使用しているコードの場合は、バージョンアップに伴いコード自体がなくなる場合もありますので、この辺りは調べて出てきた情報でも使用しているバージョンなどに注意したいですね。
unable to convert unpermitted parameters to hash
許可されてないパラメータはハッシュにできません というエラーです。
こちら
これがどのようなコードで起きたかというと、URLにパラメータを渡そうとしたコードです。
URLに渡すためには、hoge.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
という書き方が通らなくなってしまいました。
これは困ったな〜となった時にみるべきものは公式のドキュメントですね。
こちらのRspecの公式ドキュメントを見てみましょう。
requesting a JSON response というまさに!な場所がありました。
headersを持たせたコードに変更して無事解決しました。
redirect to :back が動かない
直前のページにリダイレクトさせたいコードで書かれていた
redirect_to :back
が動かなくなりました。
こちらも調べるべきは公式ドキュメントです。
という書き方に変更して解決する音ができました。
id の型が integer から big intに変更
デフォルトでidカラムはintで作成されますが、5.1からはこれがbigintに変更されました。こちら
型が違うと外部キー制約を貼れないため、5.1以降で新規にテーブルを作成したものと5.0以前で作成したもの(intとbigint)が混在すると問題が発生します。
弊社はBtoBのサービスであり、idの枯渇については高負荷サービスと比べると心配が少ないため、開発の工数などとの兼ね合いもあり、int型で作ることをそのまま維持する(migrationファイルを5.0で走らせれば良いだけです)ことを選択しました。
終わりに
いかがでしたでしょうか。
今回はバージョンアップの際の全てではなく、実際に動いているプロダクトで起きた問題に絞って記事を書かせてもらいました。
最後に、弊社ではエンジニアを絶賛大募集中です!
興味のある方はこちらから是非ご応募ください!
明日23日はzouzei8to10さんによる、【AdobeXDのコンポーネントで可変テキストのタブをつくる】です。
お楽しみに。