Rails 5へのアップグレード手順メモ(Rails 4.2.6 => 5.0.0)

  • 71
    Like
  • 0
    Comment

Rubyをアップグレードする

Rails 5にはRuby 2.2.2以上が必要。
これより古いものを使っている場合は、まずRubyのバージョンを上げる必要がある。
具体的なバージョンアップ方法は環境によって異なるので割愛。

Rubyのバージョンは、Gemfileでrubyディレクティブを使ってバージョンを指定するのがおすすめ。

ruby '2.3.1'

RailsのGemをアップグレードする

Rails 5へのアップグレード前に、Rails 4系の最新のバージョンで動作確認して、DeprecationのWarningやその他の問題が無い状態にすべき。また、十分なテストカバレッジも必要。

準備が完了したら、Gemfileのバージョンを5.0.0に書き換える。

gem 'rails', '5.0.0'

次に、bundle updateコマンドを実行する。ここでは、Railsのgemだけをアップデートする。

$ bundle update rails

Rails update

以下のコマンドを実行して、Railsの設定ファイル等を更新する。

$ bin/rails app:update

rails rails:updateと書いてある(古い)ドキュメントもある。これでも動くが、DeprecationのWarningが出るので注意。

rails app:updateを実行すると、conflictが発生した際に確認メッセージが表示される。

大半は上書きしても問題無いものだけど、config/routes.rbに定義したルーティングを全て消去したりするので、確認は慎重に。

ApplicationRecordをActiveRecordのモデルのベースクラスにする

Rails 5のアプリを新規作成すると、ActiveRecordの各モデルはApplicationRecordを継承する。この継承関係は必須ではないが、Rails 5ではこの方式が推奨される。

Rails 4からアップグレードしたアプリケーションでは、ApplicationRecordを自分で作る必要がある。

はじめに、app/models/application_record.rbを以下の内容で作成する。

class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
end

次に、各モデルクラスの継承関係を変更する。たとえば、

class Product < ActiveRecord::Base

は、以下のように変更する。

class Product < ApplicationRecord

ApplicationJobをActiveJobのクラスのベースクラスにする

ActiveRecordと同様、ActiveJobも継承関係の変更が推奨される。

初めに、app/jobs/application_job.rbを以下の内容で作成する。

class ApplicationJob < ActiveJob::Base
end

次に、ActiveJobの各クラスのスーパークラスを、ActiveJob::BaseからApplicationJobに変更する。

コールバックチェーンの変更点

Rails 5ではコールバックチェーンの挙動が変わっている。

Rails 5では、コールバックチェーンを止めるには、明示的にthrow(:abort)を呼ぶことが推奨される。一方、以前のバージョンのRailsでは、コールバックメソッド内でfalseを返せばコールバックチェーンを止めることができた。

Rails 4から5にアップグレードすると、コールバックチェーンは従来と同じように動作するが、DeprecationのWarningが出力されるようになる。ソースコードを修正し、アプリケーションが新しいコールバックチェーンの挙動で動作できるようになったら、Initializerの中で以下のメソッド呼び出しを行うことで、新しい挙動を有効化して、Warningを止めることができる。

ActiveSupport.halt_callback_chains_on_return_false = false

テストの実行

この段階で、定型的なアップグレード手順は終了。あとは、テストを実行して、発生したErrorやWarningを1つずつ潰していく。