はじめに
今年の3月にDocBaseのRailsのバージョンを4系から5系にアップデートしました。
今回はDocBaseだけではなく、他のRailsで作られている他のアプリをRails5にアップデートする時でも参考になりそうな部分をまとめました。
gem
squeel
2015年から開発が止まっているのとRails5対応しないのとwhereでplaceholderを使えば済むので外しました。
- Post.where.has { created_at < 3.days.since }
+ Post.where('created_at < ?', 3.days.since)
どうしても使いたい場合は書き換えは必要ですが、baby squeelはメンテされてるのでそちらに移行するという手もあると思います。
quiet_assets
https://github.com/rails/sprockets-rails/pull/355
Rails5から標準で取り込まれたので別途導入する必要がなくなりました。
rails_12factor
https://github.com/heroku/rails_12factor#migrating-to-rails-5
Migrating to Rails 5を参考に修正することで、Rails 5から必要がなくなりました。
rails-observers
RubyGemsにRails 5に対応したバージョンがなかっためgithubリポジトリから取得するように変更しました。
https://github.com/rails/rails-observers
haml_coffee_assets
https://github.com/emilioforrer/haml_coffee_assets/issues/152
RubyGemsのものでは動かず、githubのリポジトリから取得するようにしました。
draper
Rails 5の場合対応してるのが3.0.0pre1だったのでアップデートしました。 http://yamakichi.hatenablog.com/entry/2016/08/26/235117
rails-controller-testing
http://rspec.info/blog/2016/07/rspec-3-5-has-been-released
For new Rails apps: we don’t recommend adding the rails-controller-testing gem to your application. The official recommendation of the Rails team and the RSpec core team is to write request specs instead.
Rails 5からassingsをコントローラーテストで使えなくなりました。代わりにrequest specに置き換えるのが推奨されました。
assingsを大量に使ってる箇所がありrequest specに置き換えるのが大変だったためrails-controller-testingを使うことにしました。
rails-controller-testingを導入することで今まで通りassingsを使えるようになります。
mail_views
Rails標準のActionMailer::Previewに移行しました。
settingslogic
Rails標準のconfig.xに移行しました。
ActiveRecord
Unsupported argument type: Hash. Construct an Arel node instead.
- scope.joins(:tags).group(tags: :name).count
+ scope.joins(:tags).group(Tag.arel_table[:name]).count
ハッシュで指定できなくなったのをArel nodeを使うように直しました。
DEPRECATION WARNING
DEPRECATION WARNING: uniq is deprecated and will be removed from Rails 5.1 (use distinct instead).
- User.group_members(@before[:group_ids] | @after[:group_ids]).uniq
+ User.group_members(@before[:group_ids] | @after[:group_ids]).distinct
uniqをdistinctに置き換えです。
DEPRECATION WARNING: ActionController::TestCase HTTP request methods will accept only keyword arguments in future Rails versions.
- before { get :index, id: team.id }
+ before { process :index, method: :get, params: { id: team.id } }
コントローラーテストの書き方が変わったのが原因で、この修正箇所は多かったです。
DEPRECATION WARNING: Passing a class as a value in an Active Record query is deprecated and will be removed.
- expect(Tracking.where(item_type: Team).last.user).to eq user
+ expect(Tracking.where(item_type: 'Team').last.user).to eq user
文字列で渡さないといけなくなったのでその修正です。
DEPRECATION WARNING: The error key `:restrict_dependent_destroy.many` has been deprecated and will be removed in Rails 5.1. Please use `:restrict_dependent_destroy.has_many` instead.
attributes:
base:
restrict_dependent_destroy:
- many: グループに属しているメモがあるので削除できません
+ has_many: グループに属しているメモがあるので削除できませ
翻訳のキー名の変更です。
DEPRECATION WARNING: Directly inheriting from ActiveRecord::Migration is deprecated.
- class CreatePlans < ActiveRecord::Migration
+ class CreatePlans < ActiveRecord::Migration[4.2]
migrationファイル作成時にその時のRailsのバージョンが入るようになったのでその対応です。
まとめ
かかった日数
ここに書いてない修正やコードレビューやステージング環境での動作確認を含み約2週間でした。
良かった点
- テストコードがあったのでアップデートによって動かなくなった処理を特定しやすかった
- 長期間メンテするRailsアプリの場合はテストコード書くのが重要
- あまり使ってないgemの整理ができた
大変だった点
- どれ位の修正でアップデートできるかどうかの終わりが見えない状態
- gemが動かなくなるケースはRailsがアップデートしたのが原因の場合とRailsのアップデートは関係なく普段gemのアップデートしてなかったのが原因の場合があった
- テストコード以外のケースの動作確認
DocBaseについて
DocBaseは情報共有を活発にして組織が力を最大限発揮できるようにすることを目指した情報共有・ドキュメント共有サービスです。
詳しくはこちらから。
https://docbase.io
このエントリーに対するコメント
日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)
- トラックバック
「いいね!」で応援よろしくお願いします!