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