Rails 5.1の変更点まとめ

## はじめに

去る2017年2月23日、Rails 5.1.0.beta1が公開されました。

[Rails 5\.1\.0\.beta1: Loving JavaScript, System Tests, Encrypted Secrets, and more \- Riding Rails](http://weblog.rubyonrails.org/2017/2/23/Rails-5-1-beta1/)

Rails 5.1ではマイナーバージョンアップと言えど、かなり大きな変更点が多数入っているようです。
そこで上記公式ブログの内容を僕なりにまとめてみます。

### おことわり

この記事は公式ブログやpull requestの内容を読んで、筆者が個人的にまとめたものです。
実際に動かして試したりはしていないので、おかしな内容や誤解している内容が含まれている可能性もあります。

もし、「これは明らかにおかしい！」という内容を見つけた場合は、コメントや編集リクエストで優しく指摘してやってください。

### サンプルコードについて

この記事はとりあえず、Rails公式ブログの内容をなぞる形で執筆しています。
各機能の具体的なサンプルコード等については、「参考」として載せてあるリンク先のコードやpull requestの内容を確認してください。

### 2017.3.22追記：リリースノート(英語)もあわせて読むと効果的です

Rails 5.1のリリースノートが以下の公式ページにまとめられています。

[Ruby on Rails 5\.1 Release Notes — Ruby on Rails Guides](http://edgeguides.rubyonrails.org/5_1_release_notes.html)

サンプルコードも交えて新機能が紹介されているので、本記事とあわせて読むとさらに効果的です。

## JavaScriptのサポート改善

JavaScriptのサポートで大きく変わったのは以下の3点です。

### 1. yarnとNPMでJavaScriptの依存関係を管理できるようになった

`bin/yarn`コマンドでJSの依存ライブラリを追加できるとのこと。
これにより、Reactのようなライブラリを[yarn](https://yarnpkg.com/en/) + NPMで簡単に追加できるようになる。

### 2. オプションとしてWebpackを使ってJavaScriptをコンパイルすることも可能

新規プロジェクト作成時に、`--webpack`オプションを付けると、[Webpacker](https://github.com/rails/webpacker) gem用の設定が自動的に行われ、[Webpack](https://webpack.github.io/)を簡単に使えるようになる。
Webpackは従来のアセットパイプラインと完全な互換性がある。
アセットパイプラインとWebpackを共存させることも可能。
アセットパイプラインやWebpackの管理はYarnがデフォルトで行う。

### 3. jQueryがデフォルトの依存ライブラリから外された

[rails-ujs](https://github.com/rails/rails-ujs)を純粋なJavaScriptで書き直したことにより、jQueryの導入が必須ではなくなった。
これにより、jQueryを使い続けることも、使わないようにすることも自由に選択できるようになる。

**2017.2.27追記：実際に使ってみたので解説記事を書きました**

Rails 5.1を使ってVue.jsのサンプルアプリケーションを作ってみました。
想像以上に簡単に作成できたので、こちらもぜひご覧ください。

[【動画付き】Rails 5\.1で作るVue\.jsアプリケーション ～Herokuデプロイからシステムテストまで～ \- Qiita](http://qiita.com/jnchito/items/30ab14ebf29b945559f6) [![](http://b.st-hatena.com/entry/image/http://qiita.com/jnchito/items/30ab14ebf29b945559f6)](http://b.hatena.ne.jp/entry/http://qiita.com/jnchito/items/30ab14ebf29b945559f6)

### 参考

- [Add Yarn support in new apps using \-\-yarn option by Liceth · Pull Request \#26836 · rails/rails](https://github.com/rails/rails/pull/26836)
- [Drop jQuery as a dependency by guilleiguaran · Pull Request \#27113 · rails/rails](https://github.com/rails/rails/pull/27113)

## システムテスト

[Capybara](http://teamcapybara.github.io/capybara/)とChromeを利用する`SystemTestCase`がRailsに組み込まれた。
これにより、面倒な設定無しにJavaScriptに依存する画面のテストが書けるようになる。
テストが失敗したときはスクリーンショットが保存される。
データベースのクリーンアップ（テスト実行時のトランザクション管理）についても、フレームワークが面倒を見てくれる。
ただし、システムテストは遅いというトレードオフがあるので、上手に使い分ける必要がある。

**2017.2.26追記：システムテストを試してみました**

実際に`SystemTestCase`を使ってみたので、以下にその内容をまとめてあります。

[Rails 5\.1のSystemTestCaseを試してみた \- Qiita](http://qiita.com/jnchito/items/4d01f2faa1deee36bd27) [![](http://b.st-hatena.com/entry/image/http://qiita.com/jnchito/items/4d01f2faa1deee36bd27)](http://b.hatena.ne.jp/entry/http://qiita.com/jnchito/items/4d01f2faa1deee36bd27)

### 参考

- [system_test_case.rb](https://github.com/rails/rails/blob/658b5244356feba2b262e87d8b333c5a46999a5d/actionpack/lib/action_dispatch/system_test_case.rb#L11)
- [Ensure test threads share a DB connection by eileencodes · Pull Request \#28083 · rails/rails](https://github.com/rails/rails/pull/28083)

## 暗号化されたsecrets

`bin/rails secrets:setup`というコマンドを使うことで、暗号化されたsecretsを作成することができる。
secretsは暗号化されるので、GitHubのリポジトリにpushすることも可能。

暗号化されたファイルを作成する際にマスターキーが発行されるので、この値だけをリポジトリ外で管理する。

本番環境では`RAILS_MASTER_KEY`という環境変数にマスターキーの値を格納することで、暗号化されたsecretsを復号化できる。

これにより、本番環境用のパスワードやAPIキーをGitHubにpushすることを避けたり、それらの値を環境変数に保存したりする従来のプラクティスが不要になる。

### 参考

- [Add encrypted secrets by kaspth · Pull Request \#28038 · rails/rails](https://github.com/rails/rails/pull/28038)
- [実装の際に参考にされたsekrets gem](https://github.com/ahoward/sekrets)

## パラメータ化されたmailer

コントローラと同じようにmailerにパラメータを渡し、アクションを実行する前に処理できるようになった。
これにより、デフォルトのto/from/reply_toといった値をDRYに書くことが可能になる。

この仕組みは完全に後方互換性を保っているので、パラメータ化による効果が高そうなmailerから優先的に適用していくことが可能。

### 参考

- [action_mailer/parameterized.rb](https://github.com/rails/rails/blob/2dadf73891431ff16709ae41ccb552a56ce34c32/actionmailer/lib/action_mailer/parameterized.rb)
- [Offer the option to use parameterization for shared processing of headers and ivars by dhh · Pull Request \#27825 · rails/rails](https://github.com/rails/rails/pull/27825)

## Directed routesとResolved routes

Directed routesを使うと、渡されたパラメータに対して自由にルーティングを設定できる。

Resolved routesを使うと、モデルに応じたポリモーフィックなURL生成のルールを再定義できる。
これにより、`link_to @comment`という記述で、`message_path(@comment.parent, anchor: "comment_#{@comment.id}")`と同等な結果が得られるように設定できる。

シンプルなAPIであれば従来のルーティングで十分だが、場合によってはパラメータに応じて複雑なロジックでルーティングを決定しなければならないケースがある。
これまではヘルパーメソッドの作成や、その他の煩わしい実装が必要だったが、Directed routesやResolved routesを使うと、そのルールを`routes.rb`内で定義できるようになる。

### 参考

- [Implement custom url helpers and polymorphic mapping by pixeltrix · Pull Request \#23138 · rails/rails](https://github.com/rails/rails/pull/23138)

## form_tagとform_forをform_withに統合

これまではユースケースに応じて`form_tag`と`form_for`という二つのヘルパーメソッドを使い分けなければいけなかったが、Rails 5.1ではこれらが`form_with`というヘルパーメソッドに統合された。

### 参考

- [Provide form\_with as a new alternative to form\_for/form\_tag · Issue \#25197 · rails/rails](https://github.com/rails/rails/issues/25197)

## 5.1のリリース後にサポートされるバージョン

5.1がリリースされると、バグ修正は5.1.xにだけ適用される。
通常のセキュリティ修正は5.1.xと5.0.xに適用される。
深刻なセキュリティ修正は5.1.xと5.0.xと4.2.xに適用される。
すなわち、4.xは基本的にサポートされなくなる。

### 参考

- [Maintenance Policy for Ruby on Rails — Ruby on Rails Guides](http://guides.rubyonrails.org/maintenance_policy.html)

## 非推奨コードの削除

5.1のリリースに伴い、非推奨とされていた多くのコードも削除される。

## まとめ

というわけで、この記事ではRails公式ブログの内容をベースにした、Rails 5.1.0.beta1の新機能を紹介しました。
こうやって見ると、野心的な改善点がたくさん入っていますね。

Railsプログラマのみなさんは来たるべき変化に向けて、しっかり準備しておきましょう！

### あわせて読みたい

Rails 5.0の新機能はこちらにまとめてあります。

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