[Ruby on Rails 4] Rails 4.2 -> 5.0, Ruby 2.4 -> 2.5 へアプリをメジャーアップグレードする
つづきです。
Contents
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_zone
とconfig.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.active_record.time_zone_aware_types = [:datetime, :time]
差分をチェックする
Rails アップグレードガイドと RailsDiff を参考にファイルの差分を修正します。
app/models/application_record.rb を作成します。
すべてのモデルが ApplicationRecord を継承するように変更し、動作を確認します。
class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true
end
bin/rails spec
でテストを実行します。
config/initializers/new_framework_defaults.rb に追記された内容を確認します。
可能な範囲で調整します。
bin/rails spec
でテストを実行します。
Ruby のバージョンを上げる
.ruby-version であらかじめインストールしておいたバージョンに変更します。
bin/rails spec
でテストを実行し、パスして終了です。
- 2.4.9 -> 2.5.7
つづく。