[Ruby on Rails 4] Rails 4.2 -> 5.0, Ruby 2.4 -> 2.5 へアプリをメジャーアップグレードする

つづきです。

Rails のバージョンを上げる

まずアップグレード用の git branch を作成します。

% git checkout -b rails-5-0-migration

Rails 5.0 系の最新版を探して Gemfile を編集します。

  • Rails 4.2.11.1 -> 5.0.7.2

bundle update rails を実行します。

% bundle update rails

依存関係で怒られるので、さらに前回 Rails 4 向けにバージョンを固定していた Gem を中心にチェックしていきます。
RailsDiff に該当する gem があれば、念のためバージョンも確認します。

Bundler could not find compatible versions for gem "activesupport":
  In Gemfile:
    haml-rails (~> 2.0) was resolved to 2.0.1, which depends on
      activesupport (>= 5.1)

    rails (>= 5.0.7.2, ~> 5.0.7) was resolved to 5.0.7.2, which depends on
      activesupport (= 5.0.7.2)

最終的にはこんな形で bundle update を完了しました。

% bundle update haml-rails i18n_generators jquery-rails jquery-ui-rails meta_request rails rails-i18n rspec-rails sass-rails web-console

rails app:update を実行する

rails app:update を実行します。
diff を見ながら必要なファイルを上書き、修正します。

  • config/routes.rb
    • デフォルトに戻ってしまうので上書きしません。
  • config/application.rb
    • config/initializers/assets.rb/node_modules の設定を移動しました。
    • config.time_zoneconfig.i18n.default_locale の設定を戻しました。
    • config/initializers/generators.rb を作成し、そこに config.generators の設定を戻します。
  • config/environments/development.rb
    • bullet の設定を元に戻しました。
  • config/initializers/new_framework_defaults.rb
    • 既にある to_time_preserves_timezone の設定を削除しました。

Rails 5へのアップグレード中に上のコマンドで生成したconfig/initializers/new_framework_defaults.rbファイルでは、rails newした場合と異なり、Rails 5の新機能はオフに設定されますので、これらの新機能がRails 4アプリの機能に影響せずに済みます。 実行後、新機能を確認しながら新機能を順次オンにすることで、アップグレード作業がやりやすくなります。

[Rails 5] Rails 5の新フレームワークデフォルト設定ファイルでアップグレード作業を軽減する|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社

テストを修正する

プロジェクトファイルの修正が完了したのでテストを実行します。

エラーが表示されました。
rails-controller-testing を加えて bundle install します。

% bin/rake spec
    :
Failures:

  1) DeliveryChargesController GET #index assigns all delivery_charges as @delivery_charges
     Failure/Error: expect(assigns(:delivery_charges).size).to eq(5)

     NoMethodError:
       assigns has been extracted to a gem. To continue using it,
               add `gem 'rails-controller-testing'` to your Gemfile.
     # ./spec/controllers/delivery_charges_controller_spec.rb:19:in `block (3 levels) in <top (required)>'
    :

再度、テストを実行するとパスします。

% bin/rake spec
    :
DEPRECATION WARNING: `xhr` and `xml_http_request` are deprecated and will be removed in Rails 5.1.
Switch to e.g. `post comments_path, params: { comment: { body: 'Honey bunny' } }, xhr: true`.
     :

が、Rails 5.1 で削除される DEPRECATION WARNING が多数出ているので修正していきます。

この流れで、下記の設定を加えました。

  • config/application.rb
config/application.rb
config.active_record.time_zone_aware_types = [:datetime, :time]

差分をチェックする

Rails アップグレードガイドと RailsDiff を参考にファイルの差分を修正します。

app/models/application_record.rb を作成します。
すべてのモデルが ApplicationRecord を継承するように変更し、動作を確認します。

5.2 Active Record モデルは今後デフォルトで ApplicationRecord を継承する

app/models/application_record.rb
class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
end

bin/rails spec でテストを実行します。

config/initializers/new_framework_defaults.rb に追記された内容を確認します。
可能な範囲で調整します。

5.3 throw(:abort)でコールバックチェーンを停止する
5.20 フレームワークの新しいデフォルト設定

bin/rails spec でテストを実行します。

Ruby のバージョンを上げる

.ruby-version であらかじめインストールしておいたバージョンに変更します。
bin/rails spec でテストを実行し、パスして終了です。

  • 2.4.9 -> 2.5.7

つづく。