ネクストエンジンAPIエクスプローラーをRails5に対応させる

## はじめに

この記事は[Hamee Advent Calendar 2016](http://qiita.com/advent-calendar/2016/hamee)の19日目の記事です。

## TL;DR

[ボタン一つでネクストエンジンAPIを試す](http://qiita.com/asflash8/items/fc5774751cade5393618)で作成したアプリをRails4.2から5へアップデートしました。

1. Rubyのバージョンアップ
    - ruby 2.2.2以上
2. Railsのバージョンアップ
    - rails gemのアップデートのためにGemfileの更新と`bundle update`
3. アプリケーションのRails5対応
    - 設定ファイルなどを更新するため`bin/rails app:update`

#### Developer Networkの紹介（2017-04-25追記）

ネクストエンジンには [Developer Network](https://developer.next-engine.com) (略してDevNet）という開発者向けコミュニティサイトがあります。ここには [開発ガイド](https://developer.next-engine.com/guide) 、 [APIリファレンス](https://developer.next-engine.com/api) 、チュートリアルなど開発の役に立つ情報が盛りだくさんです。また、開発者同士でディスカッションする [コミュニティ](https://developer.next-engine.com/forum/active) もありますので、わからないことがあれば [こちら](https://developer.next-engine.com/forum/active) に質問を投稿してください。

ネクストエンジン Developer Networkwork
https://developer.next-engine.com/

## この記事で書いていること

ネクストエンジンAPIを簡単に試すウェッブアプリケーションである[ne_api_explorer](https://github.com/asflash8/ne_api_explorer)をRails5にアップデートしてみました。

## アップデートの手順

- Rubyのバージョンアップ
- Railsのバージョンアップ
- アプリケーションコードの書き換え

## Rubyのバージョンアップ

Rails5ではRubyのバージョン2.2.2以上が必要です。これ未満のバージョンの場合は（Railsではなく）Rubyバージョンアップが必要です。

```sh
ruby -v　# => ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-darwin13]
```
自分の手元の環境（Mac OS 10.9.4）ではrubyのバージョンが2.2.0だったのでアップデートします。rbenv等を使っている場合は`brew upgrade rbenv`するなどして、最新のバージョンが選択できるようにしてください。

```sh
rbenv install -l # => 2.2.6 or 2.3.3（2016.12.18現在）
rbenv install 2.2.6
```

Rubyのバージョンが上がったかを確認し、bundlerのインストールとライブラリのインストールを実行。

```bash
ruby -v　# => ruby 2.2.6p396 (2016-11-15 revision 56800) [x86_64-darwin13]
gem install bundler # rubyのバージョンが変わったのでbundleを再インストール
bundle install # gemの再インストール
```
### Herokuでの動作時の注意点

Herokuで動作させるためには`Gemfile`に`ruby '2.2.6'`のようにRubyのバージョンを明示的に指定する必要があったので後から追加しています。

```diff:Gemfile
-
+ruby '2.2.6'
```

この状態で`bundle install`を再度実行すると`Gemfile.lock`にもRubyのバージョンが追記されます。

```diff:Gemfile.lock
+RUBY VERSION
+   ruby 2.2.6p396
+
```

## Railsのバージョンアップ

Rubyのバージョンアップが終わったので今度はRails。元々4.2.5を指定していたので5系を指定。

```diff:Gemfile
-gem 'rails', '4.2.5'
+gem 'rails', '~> 5.0'
```

この状態で`bundle update`を実行。`bundle install`ではない点に注意。すると以下のようなメッセージがでて失敗。

```
Fetching gem metadata from https://rubygems.org/..........
Fetching version metadata from https://rubygems.org/..
Fetching dependency metadata from https://rubygems.org/.
Resolving dependencies...
Bundler could not find compatible versions for gem "railties":
  In Gemfile:
    rails (~> 5.0) was resolved to 5.0.0, which depends on
      railties (= 5.0.0)

    sass-rails (~> 5.0) was resolved to 5.0.4, which depends on
      railties (< 5.0, >= 4.0.0)
```

`sass-rails`の依存関係の問題があるようです。依存関係を解決するためGemfileとエラーメッセージのにらめっこをしながら最終的に以下の差分に。

```diff:Gemfile
-gem 'rails', '4.2.5'
+gem 'rails', '~> 5.0'
 gem 'pg', '~> 0.15'
 gem 'sass-rails', '~> 5.0'
 gem 'uglifier', '>= 1.3.0'
-gem 'coffee-rails', '~> 4.1.0'
+gem 'coffee-rails', '~> 4.2.1'

 gem 'jquery-rails'
-gem 'jbuilder', '~> 2.0'
+gem 'jbuilder', '~> 2.6'
```
この状態で再度`bundle update`を実行。引数にはrails以外にアップデートが必要なgemを指定。

```sh
bundle update rails sass-rails coffee-rails jquery-rails
```

すると今度は成功。で、サーバーを起動してみると・・・。起動に成功したと思いきやWARNINGがでている。この状態でlocalhost:3000にアクセスするとエラー。

```
DEPRECATION WARNING: Accessing mime types via constants is deprecated. Please change `Mime::HTML` to `Mime[:html]`. (called from require at /usr/local/rbenv/versions/2.2.6/lib/ruby/gems/2.2.0/gems/bundler-1.13.6/lib/bundler/runtime.rb:91)
DEPRECATION WARNING: Accessing mime types via constants is deprecated. Please change `Mime::TEXT` to `Mime[:text]`. (called from require at /usr/local/rbenv/versions/2.2.6/lib/ruby/gems/2.2.0/gems/bundler-1.13.6/lib/bundler/runtime.rb:91)
DEPRECATION WARNING: Accessing mime types via constants is deprecated. Please change `Mime::URL_ENCODED_FORM` to `Mime[:url_encoded_form]`. (called from require at /usr/local/rbenv/versions/2.2.6/lib/ruby/gems/2.2.0/gems/bundler-1.13.6/lib/bundler/runtime.rb:91)
=> Booting WEBrick
=> Rails 5.0.0.1 application starting in development on http://localhost:3000
```

WARNINGのメッセージでググると[web-console gemが原因らしい](http://stackoverflow.com/questions/33586425/rails-5-deprecation-warning-accessing-mime-types-via-constants-is-deprecated)のでアップデートしてみる。

```diff:Gemfile
-  web-console (~> 2.0)
+  web-console (~> 3.0)
```

`bundle update web-console`してgemを更新した状態で`bin/rails s`。さあどうだ・・・？

やった！動いた！

![ne_api_explorer_rails5.png](https://qiita-image-store.s3.amazonaws.com/0/1823/e6d7a5ba-39ba-1775-80b5-625487771581.png)


## コードの書き換え

DBを使っていないこともあって今回は不要でした。モデル層を使うならApplicationRecordなどRails5で登場したクラスなどは作成した方がよいかと思います。

## まとめ

Rails4から5への移行を試すならまずは小さなアプリで試すのがよいと思いました（小並感）

## 宣伝

1ミリたりともRails5の機能は使っていませんが、ネクストエンジンとネクストエンジンAPIと合わせて[ne_api_explorer](https://github.com/asflash8/ne_api_explorer)をよろしくお願いします。

## 参考URL

- [Rails アップグレードガイド（公式）](http://railsguides.jp/upgrading_ruby_on_rails.html)
- [これでもう怖くない！？Rails 4.1からRails 5.0にアップグレードする手順を動画付きで解説します](http://qiita.com/jnchito/items/fa680e104d4bf49ae06f)
- [Rails 5へのアップグレード手順メモ(Rails 4.2.6 => 5.0.0)](http://qiita.com/ryo511/items/2a387df126268fec8c78)
- [Rails 5 DEPRECATION WARNING: Accessing mime types via constants is deprecated](http://stackoverflow.com/questions/33586425/rails-5-deprecation-warning-accessing-mime-types-via-constants-is-deprecated)
- [herokuでRubyのバージョンを変更する](http://com4tis.net/heroku-ruby-version-change/)
- [ボタン一つでネクストエンジンAPIを試す](http://qiita.com/asflash8/items/fc5774751cade5393618)