2016年5月24日火曜日

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

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.0rc1'
次に、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つずつ潰していく。

0 件のコメント:

コメントを投稿