目次
この記事はアピリッツの技術ブログ「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に依存しなくなった。
おおまかな手順
- バージョンアップ用のブランチを切る
- Gemfileでロックされているrailsのバージョンを 5.1.2 に変更してbundle update rails
- エラーがでるので必要なgemのバージョンをあげたり、不要なgemを消したりして bundle update
bin/rails app:update
diffを確認して問題なければ上書きなどしてゆく- ActiveModelなどの親クラスを変更
- アセットまわりの変更
- (余力があれば)アセットのライブラリを yarn管理に変更
使用しなくてもよくなったgems
- debugger
- jquery.turbolinks
- quiet_assets
Turbolinksの対応
Turbolinks5に対応しているため変更になっています。
page:load
がturbolinks:load
に変更になったHistory.back
(ブラウザの戻る)などでも呼ばれるようになった
上記の変更から、以下を実施しました。
jquery.turbolinks
を使っていたがturbolinks5では動作せず使わなくてもよさそうなのでGemfile, application.jsから削除した。Turbolinks.enableProgressBar()
は本家に含まれたので削除した。jquery.turbolinks
では$()
を使うが、かわりに$(document).on "turbolinks.load", function()
に変更したjavascript_include_tag
のdata-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ガイドの日本語版は訳が追いついていないので英語版もあわせて参照してください)