はじめに
rails5.2のβ版が出ていよいよマイナーのバージョンも上がりそうですね。
githubはこちら
そういえば地球防衛軍も12/7にいよいよ、こちらも5が発売ですね!!!
今年の春頃に「夏リリース予定!」となっていたのに気がついたら「年内リリース」という表記に変わってあれ?と思った矢先「12/7リリース」となっていてテンションが上がった記憶があります。
ということでrails4系をまだ使っている人は地球防衛軍新作リリースということとともにrails5へのアップデート or 準備を済ませて今年を終えましょう!!
準備
基本的な流れは以下です。
- アップデートによりどんな変更点があるのか理解する
- アップデートの作業
- バージョンを上げる前に対応できるものがあるなら対応しておく
- (テスト)
- 本番へ
今回思ったのがgemやコードの修正点で現バージョンのうちに対応できるものが結構あるということ。なので実際のアップデート作業に入ってバージョンが確定したら「先にそっちだけでも対応できないのか」を考えると良いかもしれません。そうするとエラーも追いやすくなります。
流れに沿ってやって見ます
4.0.13 → 4.2.10
- まずdocumentを用意する。ほとんどこれを見ながらの作業になります。
rails 4.2 リリースノート
rails 4.2 アップグレードガイド
- アップグレードガイドを読む。(大きな差異がなければ一気に上げても良いと思います)
今回だと
rails4.0 → rails4.1
- デフォルトスコープの変更
- リレーションに対する破壊的メソッド呼び出し
- JSONの扱いの変更点
- Cookiesシリアライザ
僕の場合はこの辺りが影響ありそうな感じがしました。(この辺はアプリケーション内でどういうコードを書いているのか次第です)
実際に少しコードを調べてみると
- リレーションに対する破壊的メソッド呼び出し
に関しては怒られる書き方が多かったのであらかじめ対応しました。
↓
# 以前の破壊的な呼び出し方法
Author.where(name: 'Hank Moody').compact!
# 今後の破壊的な呼び出し方法
authors = Author.where(name: 'Hank Moody').to_a
authors.compact!
これでrails4.1はクリアなのでrails4.2まで上げることにしました
- 実際の作業をします。
- http://railsdiff.org/ を見てGemfileの初期状態での差異を確認します。新しい方に一旦、合わせます。そこから使わないものはコメントアウトなりしてインストールしないようにすれば良いと思います。
- Gemfileを上記の変更点に従い修正
-
bundle update rails
でrailsのバージョンをあげる - →gemのバージョンの依存関係でエラーになりますのでそこはエラー文にしたがって対応していく
- →依存関係の対応するときは僕はここを見てました。https://rubygems.org/gems
- →ここは頑張るしかないです。通るまで頑張りましょう!
-
bundle update rails
が通ったらbundle exec rake rails:update
を実行 - 終了したらgitで差分の確認をする + http://railsdiff.org/ を見て素のファイル状態の違いを見比べる
ちなみに・・・僕はbundle exec rake rails:updateを実行するときは以下の流れで行いました。
- まずhttp://railsdiff.org/で変更ありそうな箇所のファイルを開いておく
- とりあえず全部Yする!
- 各ファイルが上書きされるのでcommand + z やcommand + shift + zで変更点を確認
- 既存の設定はそのまま残し、初期設定のものはhttp://railsdiff.org/を見て調整する
conflict config/boot.rb
Overwrite /Users/katsuyukishimbo/sample/config/boot.rb? (enter "h" for help) [Ynaqdh] Y
force config/boot.rb
exist config
conflict config/routes.rb
Overwrite/Users/katsuyukishimbo/sample/config/routes.rb? (enter "h" for help) [Ynaqdh] Y
あとはテストして反映すれば完了です。
エラーになったところ
- kaminariでエラー
undefined method `num_pages' for #<Kaminari::PaginatableArray:0x0055a6e50247e8>
params[:page].to_i >= hoge.num_pages - 2
→ params[:page].to_i >= hoge.total_pages - 2
- attributesの扱いが少し変更されてた
When assigning attributes, you must pass a hash as an argument
user_attributes = params[:user]
→ user_attributes = params[:user].presence || Hash.new
- リレーション関係を削除するときの扱いが少し変更されていた
undefined method `state' for #<ActiveRecord::ConnectionAdapters::NullTransaction:0x00555fa46f3930>
user.hoges.each { |obj| obj.delete }
→ user.hoges.each { |obj| obj.destroy }
transactionで囲ってもokです。
4.2.10 → 5.0.4
流れは同じです。
- document読む
rails 5.0 リリースノート
rails 5.0 アップグレードガイド
ちなみに感覚だとrails4.2→rails5.0へはそこまで変なことは起こらなかった感じがします。
今回だとこれくらい?
- ActiveRecord::Base → ApplicationRecordに変更
- rails4系でwarningだったところがDeprecationWarningに変更されているので対応
ただ
- ActiveRecord::Base → ApplicationRecordに変更
→ app/models/application_record.rbというファイル作って
class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true
end
とするだけなのでそこまで問題にはならない。
エラーになったところ
- skip_before_filterが死んでいた
ArgumentError: Before process_action callback :redirect_hoge has not been defined
skip_before_filter :redirect_hoge
→ skip_before_filter :redirect_hoge,raise: false
- Action Mailerでの変更見落としていた
非推奨の*_pathヘルパーをemailビューから削除。 (commit)
非推奨のdeliverメソッドとdeliver!メソッドを削除。 (commit)
- Action Mailerでの変更見落としていた
非推奨の*_pathヘルパーをemailビューから削除。 (commit)
非推奨のdeliverメソッドとdeliver!メソッドを削除。 (commit)
- オプションの扱い方が変更されていた
Cannot pass a :size option with a :height or :width option:
= image_tag "hoge/hoge.png", :size=>'18',:width=>'18'
→ = image_tag "hoge/hoge.png", :height=>'18',:width=>'18'
まとめ
rails4.2 → rails5.0系まではそこまで労力かからないと思うのであげてしまった方が良いかなという印象を持ちました!ちなみにrails5.0 → rails5.1はマイナーなのに結構変更点が多く、まだエラーを消せていないので消せたら更新していこうかなと思います。
rails5.1からのSystemTestCase
rails5.2からのActive Storage
など便利そうなのが出てきているので今月中にrails5.0まであげて年末年始で触ってみるというのも良いかもしれません。