Rails経験数ヶ月の新卒でもできた!Railsのversionを3から5にupdateしたお話

クライアントワーク事業部サーバサイドチーム所属しております。長谷川です。

みなさま初めまして!こちらの記事はTech Kayac Advent Calendar Migration Trackの21日目の記事です!

今回はとあるRailsで動いているサービスのversionを3から5にアップデートしたお話を綴っていきたいと思います。

はじめに

どういう切り口でお話を進めようかすごく迷いますね・・・

細かい内容はGoogle先生に聞いたら先人のみなさまの知見にアクセスできると思いますので、ここでは「こんなことがあったんですよーハハハ」的な感じで進めていこうと思います

そもそもですが・・・私はタイトルの通り今年新卒で入社してRuby歴もRails歴も数ヶ月程度のペーペーでございます。 Rubyはみんな大好きチェリー本こと『プロを目指す人のためのRuby入門』を読んだ程度でRailsも『パーフェクトRuby on Rails』を読んだ程度ですね。

パーフェクト Ruby on Rails

パーフェクト Ruby on Rails

かれこれ数年ほど前から「アップデートしないとなぁ」という話が上がっていたものの先送りされていたことなんだそうです。そんな中、カヤックのコーポレートサイト のRailsのversionアップをやってのけた私のメンターのところにお話が舞い込み、私がやってみることになりました!

何をどうアップデートしたか

  • Ruby  2.1.2 => 2.6.3
  • Rails 3.2.22.4 => 5.2.3

メジャーバージョン2つ分を爆上げですね・・・

このプロジェクトは・・・

そこそこの年月続いているサービスのようです。

DBのtable数をのぞいてみると155ありました。

個人では実感のわかないtable数ですね・・・規模としては結構大きいものなんだそうです。

github上に上がっているrubyのファイルは1649個・・・View用のSlimファイルも818個・・・もう何が何だか

(私の経験値的に大きいのはわかるがどれぐらい大きいのかピンとこない・・・)

どうやって進めて行ったか

頼りになる先輩もいらっしゃるので、相談して進めていくことに

  1. まずは用意されているRSpecのテストが通るか確認する
  2. Rubyのversionを最新にしてみる
  3. Railsのversionを4.2にあげてgemの依存関係を更新
  4. rails serverで起動できるようにする
  5. Railsのversionを5.2にあげてgemの依存関係を更新
  6. rails serverで起動できるようにする
  7. RSpecのテストが通るようにする

エラーになったときこういうところを参考にしましたよ

1. やはり本家本元Railsガイド!

railsguides.jp

アップグレードガイドやリリースノートなど素晴らしいリソースが盛りだくさん!

2. gemのgithubのREADMEやWikiやissue

こちらも情報盛りだくさん! ほとんど英語で読むのがしんどいところもあるけどgemに関してのエラーの対処は最短ルートを提示してくれているものがたくさんあって助かりました。

これら以外にも、QiitaやStackOverFlowも参考にさせていただいている部分が結構あります!

3. プロジェクトのコミットログやコメント

上二つの情報をみてもrailsのversionを4.2にあげたあたりで原因がわからず途方に暮れて相談しにいったとき・・・

頼りになる人 「initializerでモンキーパッチ当ててるねぇ コミットログとか見てみて」

コミットログは・・・

rails 3.2.22.2 で query method には 4 つの引数が必要になった しかし、jpmobile の rails 3 のものにはそれの対応がこないので、 モンキーパッチを当てて回避. 4.2 ぐらいまであげられたら消したい。

まさしく今がそのとき!

コミットメッセージ残してくださって本当にありがとうございました! 私もコミットのメッセージを丁寧に書こうと思った瞬間でした。

大変だったなと思うエラー達

attr_accessibleとの戦い ~これ全部StrongParamaterにするんですか!?~

Railsのversionを4.2にあげてrails serverしようとしたときのこと・・・

undefined method `attr_accessible' 

ふむふむ attr_accessibleが無いと・・・なるほど

Rails アップグレードガイド - Railsガイドをみると確かに書いてあります。

Rails 4.0ではStrong Parametersの導入に伴い、attr_accessibleとattr_protectedが廃止されました。これらを引き続き使いたい場合は、Protected Attributes gem を導入することでスムーズにアップグレードすることができます。

Protected Attributes gemを入れればいいのか!

(このとき彼はその場しのぎであることには気づかないのであった・・・)

そもそもattr_accessibleってなんだ? attr_accessible (ActiveRecord::Base) - APIdockによるとマスアサインメントの脆弱性の対策に利用するようですね。

確かにStrongParameterが実装されたのなら必要なさそうだ。ただ、attr_accessibleはActiveRecordのメソッドなのでモデルで利用されているのに対し、StrongParamaterにするためのpermitメソッドはActionControllerのものなのでコントローラーに書く必要があります。attr_accessible使ってるところが膨大にあって全部書き換えるのはしんどい・・・gemで対応できるならそうしちゃおう!

さてさて、審判の時・・・Railsのversionを4.2=>5.2にあげてみると

protected_attributes gem のサポートを終了。 Ruby on Rails 5.0 リリースノート - Railsガイドより

あ・・・ぐぬぬ・・・

そうも言っていられず色々調べていると救世主が・・・! tech.pepabo.com ほんと助かりました! これのおかげで万事解決では無いもののかなり短縮できました。

image_tagcarrierwaveとの戦い ~画像がなければ作ればいいのよ~

image_tagでエラーが出てる・・・

nil is not a valid asset source

stackoverflow.com

ふむふむ、rails5になってimage_tagnilを許容しなくなったのか!なるほどなるほど

引数に渡しているのはcarrirewaveでアップロードした画像のversionを指定しているURLのよう

uploaderにはたくさんversionを定義されていました。 ついでに何やら怪しいコメントも・・・

 # application.controller内のcarrierwave_version_on_the_flyから呼ばれているときだけ、VERSIONSが有効になる
 # すなわち、アップロード時にはVERSIONSをつくらない

それでversionが生成されていないからnilになるのか・・・

image_tagで確認した後に画像がなかったらversionを作って表示するということらしい(後で教えてもらった)

あれ・・・image_tagのそもそものエラーが出ている場所はActionViewではなくconfig/initializers/image_tag_helper.rb 嫌な予感・・・中身を確認してみる

# 標準のimage_tagヘルパをオーバーライド
def image_tag(source, options = {})
# ↓↓改造ここから↓↓

Oh... 改造って書いてある・・・(なんかカッコイイ!)

オーバーライドしてるならsourcenilが渡されたときの動作を書き加えてなんとかできる気がするぞ。

image_tagcarrierwaveの間に依存関係ができていたようですね。 コメントがあって助かりました!

振り返ってみる

感想など

エラーの原因などがRubyによるものなのかRailsによるものなのか、はたまたgemによるものなのか・・・ いったいどれなんだぁ・・・わけがわからん・・・と思いながら最初の方は進めていましたが、後半になってくるとそれを紐解いていくのがちょっと楽しくなってきました。

RubyやRailsについての知見がとても深まりました!

どれぐらいかかったのか

このアップデート作業を始めたのがちょうど6月の頭で12月まで続きました・・・ 期間的には半年ですが、最初のうちは1週間のうち2日をこちらの作業に当てるペースでしたが、1,2ヶ月ほど別の案件に注力していた時期もあったり、そして11月はこのアップデートにがっつり時間をさいてブーストして完了しました。トータルで見ると2~3ヶ月といった感じでしょうか

Rails6についても少し

updateをやってる最中にRails6がリリースしました。 Rails6まであげてしまおうかと言う話もありましたが、Rails5.2の公式のサポートも続いていることと、一部のgemがRail6に対応していないということもありRails6へのupdateは見送ることになりました。

+α ちょっと脱線ですが・・・

私のメンターが超オススメしているRubyの本『メタプログラミングRuby』にも助けてもらったので載せておきます! Ruby初心者がステップアップできるような内容だなと勝手に思っております。

メタプログラミングRuby 第2版

メタプログラミングRuby 第2版

  • 作者:Paolo Perrotta
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2015/10/10
  • メディア: 大型本

Rubyはモンキーパッチやゴーストメソッドのおかげか実装が実際にどこに書かれているのかわからないなんてことも結構ありました・・・ チェリー本の作者の伊藤淳一さんのQiita記事なんかもとても参考になりました。ありがとうございました!

qiita.com

最後に

いやはや本当にいろんな人に助けてもらいました。 ありがとうございました!

そして、最後まで読んでいただき、これまたありがとうございました!