これでもう怖くない！？Rails 4.1からRails 5.0にアップグレードする手順を動画付きで解説します


## はじめに

みなさんお待ちかねのRails 5.0が先日リリースされました。
これまでRailsを使って開発してきた方は、おそらく既存のRailsアプリケーションではRails 4系を使っているんじゃないかと思います。（Rails 3以前の方もいるかもしれませんが・・・）

しかし、中には「Rails 5にアップグレードしたいけど、やり方がよくわからない・・・」と困っている方もいるんじゃないでしょうか？
そこでこの記事ではRails 4.1で作ったサンプルアプリケーションをRails 5.0にアップグレードする手順を説明します。

## （この記事よりも詳しい）解説動画はこちら！

アップグレードの手順はYouTubeにアップした動画の中で詳しく説明しています。
この記事は動画の説明内容を簡単にピックアップするだけにとどめているので、Rails 5にアップグレードしようと考えている方は、必ず動画の方もチェックしてください！

[![Screen Shot 2016-07-09 at 09.25.12.png](https://qiita-image-store.s3.amazonaws.com/0/7465/99df642a-3298-a23a-26a7-16f64d6e532e.png "Screen Shot 2016-07-09 at 09.25.12.png") これでもう怖くない！？Rails 4\.1からRails 5\.0にアップグレードする手順を動画付きで解説します \- YouTube](https://www.youtube.com/watch?v=0FRNPY7WJ7w)

なお、今回の動画は1時間ちょっとあるので、 **1.5倍～2.0倍ぐらいの再生速度** で再生することをオススメします。

### RubyMineも活用しています

動画の中ではRubyMineをメインのエディタ（IDE）として使用しています。
RSpecの実行やdiffの確認など、RubyMineの便利機能がいろいろ見られるので、RubyMineに興味がある人もぜひ動画をチェックしてみてください。



[![Screen Shot 2016-07-09 at 09.25.44.png](https://qiita-image-store.s3.amazonaws.com/0/7465/c99b3670-1761-4b23-9cd8-88996ce0c215.png "Screen Shot 2016-07-09 at 09.25.44.png")](https://www.youtube.com/watch?v=0FRNPY7WJ7w)


## 今回使用するサンプルアプリケーション

この記事では電子書籍「[Everyday Rails - RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp)」で使われているサンプルアプリケーションをRails 5にアップグレードします。

![Screen Shot 2016-07-09 at 09.29.25.png](https://qiita-image-store.s3.amazonaws.com/0/7465/76ff3cfe-9ede-c314-1013-ec8eb68400c3.png "Screen Shot 2016-07-09 at 09.29.25.png")


このアプリケーションのオリジナルの動作環境は **Ruby 2.1.1 + Rails 4.1.1** です。

なお、Everyday Railsのサンプルアプリケーションは使用するものの、この記事自体は書籍「[Everyday Rails - RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp)」の内容そのものとは関係ありません。（あくまで個人の趣味で書いています）

### サンプルアプリケーションのソースコード

サンプルアプリケーションのオリジナルのソースコードはGitHubに公開されています。
ですので、誰でも参照することが可能です。

https://github.com/everydayrails/rails-4-1-rspec-3-0

実際にアップグレードをやってみたい方は自分のアカウントにフォークして試してみてください。

## 作業のおおまかな流れ

アップグレード作業をざっくり説明するとこんな感じです。
なお、カッコ内の数字は動画の開始ポイントを示しています。

1. 公式のアップグレードガイドを確認する（1:20）
2. アップグレード用の作業ブランチを作る（3:25）
3. 現状のテストが全部パスすることを確認する（3:50）
4. Rubyのバージョンを最新版にアップグレードする（6:30）
5. テスト関連のgemを最新版にアップグレードする（10:15）
6. Rails 4.2.6にアップグレードする（13:50）
7. Rails 5.0.0にアップグレードする（30:15）
8. Rails 5 らしく書き直す（1:02:40）

それでは以下で詳しい手順を説明していきます。

## 1. 公式のアップグレードガイドを確認する（1:20）


アップグレードの手順はRailsガイドでも説明されています。
まずは公式の情報に目を通して、何がどう変わるのか、どういった点に気をつければいいのかを確認しておきましょう。


なお、執筆時点（2016年7月9日）では、日本語訳が読めるのはRails 4.2までです。
Rails 5.0へのアップグレード手順は英語版を読む必要があります。

日本語訳もRails 5に対応しました。（2016/7/14）

[Rails アップグレードガイド \| Rails ガイド](http://railsguides.jp/upgrading_ruby_on_rails.html)

また、リリースノートの日本語訳もあります。
こちらも一通りチェックしておくといいでしょう。

[Ruby on Rails 4\.2 リリースノート \| Rails ガイド](http://railsguides.jp/4_2_release_notes.html)

[Ruby on Rails 5\.0 リリースノート \| Rails ガイド](http://railsguides.jp/5_0_release_notes.html)

## 2. アップグレード用の作業ブランチを作る（3:25）


いきなりmasterブランチで作業せず、専用の作業ブランチを作ってから、最後にmasterにマージするようにしましょう。

今回は rails-5-0 という作業ブランチを作りました。

## 3. 現状のテストが全部パスすることを確認する（3:50）


もし、最初からテストが壊れていると、テストが失敗してもアップグレードが原因かどうか区別が付きません。
なので、現状のテストが全部パスすることを確認します。

今回は selenium-webdriver のバージョンが古くてテストが途中で止まってしまったため、selenium-webdriver をアップデートする必要がありました。

[（diffを確認する）](https://github.com/JunichiIto/rails-4-1-rspec-3-0/commit/995b0eb6a9cb798454eda1cc713035de25ebe305)

## 4. Rubyのバージョンを最新版にアップグレードする（6:30）


**Rails 5はRuby 2.2.2以上でないと動きません。**
なので、このタイミングで最新版のRubyにアップグレードしておきましょう。

執筆時点（2016年7月9日）ではRuby 2.3.1が最新なので、このバージョンにアップデートします。
Rubyのバージョンを上げたら、テストが全部パスすることを確認します。

なお、今回は bundle install 実行時に、json gemのインストールでエラーが発生しました。
そこで、`bundle update json`を実行して json gemのバージョンを上げてこのエラーを解決しました。

[（diffを確認する）](https://github.com/JunichiIto/rails-4-1-rspec-3-0/commit/9f7600280b9ce859da4c77e86b83bfb95ecac59a)

## 5. テスト関連のgemを最新版にアップグレードする（10:15）

rspec-railsはバージョンが古いと最新のRailsでうまく動作しないことがあります。
そこで、Railsのバージョンを上げる前に、rspec-railsを最新版（執筆時点の最新版は3.5.0）にアップグレードします。

`bundle update rspec-rails`を実行した際に依存関係でエラーが出る場合は、エラーの原因になっているgemも一緒にアップデートします。
今回は guard-rspec も一緒にアップデートする必要がありました。

rspec-railsのバージョンを上げたら、テストが全部パスすることも確認しておきましょう。

[（diffを確認する）](https://github.com/JunichiIto/rails-4-1-rspec-3-0/commit/df4fc44cfd724bc391befa75e6c1bd3446e6b7d6)

## 6. Rails 4.2.6にアップグレードする（13:50）


いきなり4.1から5.0に上げるよりも、先にRails 4系の最終版であるRails 4.2にアップグレードしてから5.0にアップグレードする方が安全です。

というわけで、まずGemfileで `gem 'rails', '4.2.6'` を指定し、`bundle update rails`を実行します。

gemのインストールが終わったら、`bin/rake rails:update`を実行して設定ファイル等をアップデートします。
このときdiffを確認(d)しながら、上書き(Y)、またはスキップ(n)を選択します。

`bin/rake rails:update`の実行が終わったら、gitのdiffを確認しながら必要に応じて上書きされたコードを元に戻していきます。

ここまで終わったらテストを実行して結果を確認します。

今回はテスト実行時に turbolinks のバージョンが古いことに起因するエラーが発生していたので、`bundle update turbolinks` で turbolinks のバージョンも上げました。

テストが全部パスしたら、念のためブラウザ上でも動作確認しておきます。

特に問題が無さそうであれば、これでRails 4.2.6へのアップグレードは完了です。

[（diffを確認する）](https://github.com/JunichiIto/rails-4-1-rspec-3-0/commit/c48efc646cfda1f529a180a00b86df5e0db4c069)

## 7. Rails 5.0.0にアップグレードする（30:15）

さて、いよいよここからがRails 5.0へのアップグレード作業です。
基本的な流れはRails 4.2.6へのアップグレードと同じです。

まずGemfileで `gem 'rails', '5.0.0'` を指定し、`bundle update rails`を実行します。

しかし依存関係でエラーが出るので、関連するgemも一緒に最新版にアップグレードします。

今回は以下のgemも一緒にアップデートする必要がありました。

- factory-girl
- jquery-rails
- sass-rails
- coffee-rails
- jbuilder
- shoulda-matchers

続いて、`rails app:update`を実行して設定ファイル等をアップデートします。
（Rails 4系とは微妙にコマンドが変わっているので注意！）

「diffを確認(d)しながら、上書き(Y)、またはスキップ(n)を選択」、「一通り終わったらgitのdiffを確認しながら必要に応じて上書きされたコードを元に戻す」という流れはRails 4.2.6のときと同じです。

ここまで終わったらテストを実行して結果を確認します。

今回はテスト実行中に発生したエラーや警告に対して、以下のような対応をしました。

- shoulda-matchers用の設定をrails_helper.rbに追加
- コントローラのテストの仕様が変わったので、[rails-controller-testing](https://github.com/rails/rails-controller-testing) gemを追加
- CapybaraとDatabaseCleanerを最新版にアップグレード
- コントローラスペックのパラメータを`params:`で囲む
  - 例：`get :index, letter: 'S'` => `get :index, params: { letter: 'S' }`

テストを実行してすべてのエラーと警告が出なくなったら、ブラウザ上でも動作確認しておきます。

特に問題が無さそうであれば、これでRails 5.0.0へのアップグレードは完了です。

[（diffを確認する）](https://github.com/JunichiIto/rails-4-1-rspec-3-0/commit/a83bb29db140f06cded3781247a83bc79d34abdd)

## 8. Rails 5 らしく書き直す（1:02:40）

アプリケーションの動きだけ見るとここで終わっても問題無さそうなのですが、せっかくなのでRails 5 らしいお作法に従ってコードを直しておきましょう。

今回は config/application.rb に書いてあった generators の設定値を config/initializers/generators.rb に移動させました。

[（diffを確認する）](https://github.com/JunichiIto/rails-4-1-rspec-3-0/commit/a85038e4926cb87be3696af518b2576bdd020f55)

それから、app/models/application_record.rb を作成し、モデルの継承元を`ActiveRecord::Base`から`ApplicationRecord`に変更しました。

[（diffを確認する）](https://github.com/JunichiIto/rails-4-1-rspec-3-0/commit/1f6e79c21782e472424593a11c0b182b198b2d43)

ここでも修正後にテストを実行してテストが全部パスすることを確認します。

今回のサンプルアプリケーションではこの2点だけを修正しましたが、みなさんのアプリケーションでは他にも修正すべきポイントがあるかもしれません。
詳しくはRailsガイドをチェックしてみてください。

[A Guide for Upgrading Ruby on Rails — Ruby on Rails Guides](http://guides.rubyonrails.org/upgrading_ruby_on_rails.html)

本記事で説明するアップグレード手順はこれでおしまいです。
お疲れ様でした！

## Rails 5.0版のコードはこちら

動画の中で説明したコードは僕のGitHubリポジトリにpushしてあります。
よかったらこちらも参考にしてみてください。

https://github.com/JunichiIto/rails-4-1-rspec-3-0/tree/rail-5-0

## 参考になりそうな他のブログ

以下のブログにもRails 5へのアップグレード手順が詳しく解説されています。
自分でトライしてみて解決できない問題が出てきた場合は、こちらのブログを読むと解決するかもしれません。

[最速で Forkwell を Rails 5 にアップグレードしてみました \- Grooves開発ブログ](http://tech.grooves.com/entry/2016/07/01/184458)

## まとめ

というわけで、この記事ではRails 4.1からRails 5.0にアップグレードする手順を説明しました。

冒頭にも書いたように動画の方がより詳しく説明しているので、アップグレードにチャレンジする方はぜひ動画もチェックしてみてください。

[![Screen Shot 2016-07-09 at 09.25.12.png](https://qiita-image-store.s3.amazonaws.com/0/7465/99df642a-3298-a23a-26a7-16f64d6e532e.png "Screen Shot 2016-07-09 at 09.25.12.png") これでもう怖くない！？Rails 4\.1からRails 5\.0にアップグレードする手順を動画付きで解説します \- YouTube](https://www.youtube.com/watch?v=0FRNPY7WJ7w)

また、動画を見てもらうとよくわかると思いますが、テストを自動化しているかどうかでアップグレードの作業効率に雲泥の差が出てきます。
「Railsのテストの書き方がわからない」「テストを書くのはどうしても苦手」という方は電子書籍「[Everyday Rails - RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp)」を読んで、テストの書き方をマスターしましょう！（宣伝）

[Everyday Rails - RSpecによるRailsテスト入門![Screen Shot 2016-06-15 at 09.14.08.png](https://qiita-image-store.s3.amazonaws.com/0/7465/5802d72a-2002-f5ef-70a9-550dacc1185f.png "Screen Shot 2016-06-15 at 09.14.08.png")
](https://leanpub.com/everydayrailsrspec-jp/) 

### あわせて読みたい

過去に書いたRails 5関連のQiita記事です。
よかったらこちらもどうぞ。

[Rails 5\.0で追加される主な新機能（Ruby on Rails公式ブログより） \- Qiita](http://qiita.com/jnchito/items/6a93320334c48b967dfb)

[Rails 5 \+ ActionCableで作る！シンプルなチャットアプリ（DHH氏のデモ動画より） \- Qiita](http://qiita.com/jnchito/items/aec75fab42804287d71b)

テストコード関連のgemを最新にしたタイミングで、こちらの対応もあわせて実施すると良いかもしれません。

[JavaScriptを実行するフィーチャスペックでActiveRecordへのモンキーパッチを無くす方法 \- Qiita](http://qiita.com/jnchito/items/ec04537b352123cab288)