search
LoginSignup
124

More than 3 years have passed since last update.

posted at

updated at

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

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つずつ潰していく。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
124