ホーム DoRuby Ruby on Rail 4.2 から 5.1 へ移行した際のメモ
Ruby on Rail 4.2 から 5.1 へ移行した際のメモ
 

Ruby on Rail 4.2 から 5.1 へ移行した際のメモ

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

Ruby on Railsのバージョンを 4.2 から 5.1 へ移行したときのメモです。 基本的にRailsガイドの手順通りにやれば問題ありませんが、Turbolinksではまります。

移行の前に

これはRuby on Rails 4.2 から新機能は使わずに5.1に移行したときのメモです。
rubyをとりまく環境の変化はとても速いので、前のバージョンがすぐに Deprecatedになったりします。
ですが、古いバージョンから一気に最新バージョンをあげるのはとても大変です。
日頃からバージョンアップを試みてJenkinsなどのCIで自動テストする環境を整えておきましょう。

環境

移行前

Ruby 2.3.3
Ruby on Rails 4.2.7.1

移行後

Ruby 2.4.1
Ruby on Rails 5.1

大きな変更点

  • rakeコマンドのかわりにrailsコマンドを使うよう変更になった。
  • ActiveModelの親クラスが ActiveRecord::Base から ApplicationRecord に変更になった。
  • ActiveJobの親クラスが ActiveJob::BaseからApplicationJobに変更になった。
  • assetsにyarn, webpacker が正式に導入された。
  • jquery-ujs が rails本体 (ActionView) に取り込まれ、jqueryに依存しなくなった。

おおまかな手順

  1. バージョンアップ用のブランチを切る
  2. Gemfileでロックされているrailsのバージョンを 5.1.2 に変更してbundle update rails
  3. エラーがでるので必要なgemのバージョンをあげたり、不要なgemを消したりして bundle update
  4. bin/rails app:update diffを確認して問題なければ上書きなどしてゆく
  5. ActiveModelなどの親クラスを変更
  6. アセットまわりの変更
  7. (余力があれば)アセットのライブラリを yarn管理に変更

使用しなくてもよくなったgems

  • debugger
  • jquery.turbolinks
  • quiet_assets

Turbolinksの対応

Turbolinks5に対応しているため変更になっています。

  • page:loadturbolinks:loadに変更になった
  • History.back(ブラウザの戻る)などでも呼ばれるようになった

上記の変更から、以下を実施しました。

  • jquery.turbolinksを使っていたがturbolinks5では動作せず使わなくてもよさそうなのでGemfile, application.jsから削除した。
  • Turbolinks.enableProgressBar() は本家に含まれたので削除した。
  • jquery.turbolinksでは $()を使うが、かわりに $(document).on "turbolinks.load", function()に変更した
  • javascript_include_tagdata-turbolinks-track 属性を “reload”に変更した

AdminLTEで表示崩れ

AdminLTEという管理画面テンプレートを使っていますが、リンクでページを遷移した際画面が崩れることがありました。
turbolinks.load内で、$.AdminLTE.layout.fix(); を呼び出すことで解決しました。

ブラウザの戻るボタンで表示崩れ

History API で戻った場合でも turbolinks.load で呼ばれるようになりました。
そのため、二重に表示されることがあります。
戻るボタン押下時にはキャッシュを使って表示しますので、turbolinks:before-cache イベントを使って不要なDOMのクリアなどを行う必要があります。

その他の変更点

ActiveRecord: time型にもタイムゾーンが適用される

案外メジャーになっていませんでした。 time型は従来はタイムゾーンは適用されませんでしたが、Rails5よりタイムゾーンを考慮するようになりました。 何も対策をせずにアップデートするとJSTの場合9時間ずれます。
移行時に、DBを確認してUTCに変換する必要があります。

または、以下のオプションで従来の動きに変更できます。

config.active_record.time_zone_aware_types = [:datetime]

ActiveRecord: uniqは廃止、distinctを使う

ActiveRecord::QueryMethod#uniq が削除されました。
以前はAnimal.uniq のような記述でselect distinct * from animalsを発行してくれましたが、Rails5以降はArrayに変換されます。

同じ挙動にするためには、Animal.distinct を使います。

ActiveModel::Dirty: attribute_was の挙動の変更

モデルオブジェクトの属性を変更すると、変更前の値が xxx_was に保存される便利な機能がありましたが、Rails5以降は取得できなくなりました。xxx_was は xxx と同じ値を返すようです。xxx_changeの最初の要素を使います

animal.name = "Pig"
animal.name_was # => nil
animal.name_change # => [nil, "Pig"]
animal.name_previous_change # => nil
animal.save
animal.name_was # => "Pig"
animal.name_change # => nil
animal.name_previous_change # => [nil, "Pig"]
animal.reload
animal.name_was # => "Pig"
animal.name_change # => nil
animal.name_previous_change # => nil

リソース

Railsガイドのドキュメントや他のリソースを検索するのは当たり前なのではぶきます。
(Railsガイドの日本語版は訳が追いついていないので英語版もあわせて参照してください)

Railsアップグレードガイド(日本語)
A Guide for Upgrading Ruby on Rails

記事を共有

最近人気な記事