Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした