[Ruby on Rails 4] Rails 4.2 -> 5.0, Ruby 2.4 -> 2.5 へアプリをメジャーアップグレードする
つづきです。
> – [永久保存版!?伊藤さん式・Railsアプリのアップグレード手順 – Qiita](https://qiita.com/jnchito/items/0ee47108972a0e302caf)
> – [これでもう怖くない!?Rails 4.1からRails 5.0にアップグレードする手順を動画付きで解説します – Qiita](https://qiita.com/jnchito/items/fa680e104d4bf49ae06f)
## Rails のバージョンを上げる
まずアップグレード用の `git branch` を作成します。
“`prettyprinted
% git checkout -b rails-5-0-migration
“`
Rails 5.0 系の最新版を探して Gemfile を編集します。
– Rails 4.2.11.1 -> 5.0.7.2
> – [railsの全バージョン履歴 | RubyGems.org | コミュニティのGemホスティングサービス](https://rubygems.org/gems/rails/versions)
`bundle update rails` を実行します。
“`prettyprinted
% bundle update rails
“`
依存関係で怒られるので、さらに前回 Rails 4 向けにバージョンを固定していた Gem を中心にチェックしていきます。
[RailsDiff](http://railsdiff.org/4.2.11.1/5.0.7.2) に該当する gem があれば、念のためバージョンも確認します。
“`prettyprinted
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` を完了しました。
“`prettyprinted
% 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株式会社](https://techracho.bpsinc.jp/hachi8833/2017_02_21/35843)
## テストを修正する
プロジェクトファイルの修正が完了したのでテストを実行します。
エラーが表示されました。
`rails-controller-testing` を加えて `bundle install` します。
> – [Rails アップグレードガイド – Railsガイド](https://railsguides.jp/upgrading_ruby_on_rails.html#rails-%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88)
“`prettyprinted
% 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
:
“`
再度、テストを実行するとパスします。
“`prettyprinted
% 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
> – [Rails で DB の Time 型を扱う – おもしろwebサービス開発日記](https://blog.willnet.in/entry/2015/06/12/063731)
“`ruby:config/application.rb
config.active_record.time_zone_aware_types = [:datetime, :time]
“`
## 差分をチェックする
Rails アップグレードガイドと RailsDiff を参考にファイルの差分を修正します。
> – [Rails アップグレードガイド – Railsガイド](https://railsguides.jp/upgrading_ruby_on_rails.html#rails-4-2%E3%81%8B%E3%82%89rails-5-0%E3%81%B8%E3%81%AE%E3%82%A2%E3%83%83%E3%83%97%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%89)
> – [RailsDiff](http://railsdiff.org/4.0.0/4.2.11.1)
app/models/application_record.rb を作成します。
すべてのモデルが ApplicationRecord を継承するように変更し、動作を確認します。
> [5.2 Active Record モデルは今後デフォルトで ApplicationRecord を継承する](https://railsguides.jp/upgrading_ruby_on_rails.html#active-record-%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AF%E4%BB%8A%E5%BE%8C%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%81%A7-applicationrecord-%E3%82%92%E7%B6%99%E6%89%BF%E3%81%99%E3%82%8B)
“`ruby: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)でコールバックチェーンを停止する](https://railsguides.jp/upgrading_ruby_on_rails.html#throw-abort-%E3%81%A7%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E3%82%92%E5%81%9C%E6%AD%A2%E3%81%99%E3%82%8B)
> [5.20 フレームワークの新しいデフォルト設定](https://railsguides.jp/upgrading_ruby_on_rails.html#%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AE%E6%96%B0%E3%81%97%E3%81%84%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E8%A8%AD%E5%AE%9A)
`bin/rails spec` でテストを実行します。
## Ruby のバージョンを上げる
.ruby-version であらかじめインストールしておいたバージョンに変更します。
`bin/rails spec` でテストを実行し、パスして終了です。
– 2.4.9 -> 2.5.7
つづく。