はじめてのRails5

2016年も間もなく終了です。
今年の夏頃からIT企業が少しずつRails5への移行をしてきましたが、まだRails5を触れていない方が多いのではないでしょうか。来年はRails4からRails5へ移行する方が増えてきます。
2017年になる前にRails5を触れておきましょう。

## Rails5の環境構築

Rails5はが対応しているruby2.3をインストールします。
※ruby2.2.2以上を使用の場合、Rails5からインストールしましょう。

```
$ brew update
$ brew upgrade ruby-build
$ rbenv install --list #2.3.3が入ってるか確認してみましょう
$ rbenv install 2.3.3
$ rbenv global 2.3.3 #切り替わらなければ$ rbenv local 2.3.3でやってください。
$ ruby -v #2.3.3であることを確認
$ gem install bundler
$ gem install rails -v 5.0.0
$ rbenv rehash
$ rails -v #rails5.0.0であることを確認
```


# Rails5の新知識
以下何点かピックアップして便利な機能を取り上げます。

## Action Cable
Rails5の新機能としてAction Cableがあります。Action Cableとは **WebSocket** を扱うフレームワークで、バックエンド・フロントエンドのフレームワークを提供します。

Action Cableを用いることで、リアルタイムな双方向通信を可能にするWebSocketの機能をRailsアプリケーションに簡単に追加することが可能になりました。Action Cableには、サーバーとクライアントの両方の機能が含まれています。
サーバー側では、ApplicationCable::ConnectionやApplicationCable::Channelなどのクラスを用いて実装を行い、クライアント側では、CoffeeScript（JavaScript）のApp.cable.subscriptions.createによってサーバー側のAppearanceChannel#subscribedメソッドを呼び出します。

### channel
Rails5からActionCableのフレームワークを利用するためにchannelという仕組み

```
//ここまででrails new ~ MVC作成まで済ませてください。
$ rails g channel chat comment

```

chatチャンネルをcommentメソッド付きで作成することができます。

- app/channelsフォルダは **サーバーサイド** を実装するために使います。
- javascripts/channelフォルダは **クライアントサイド** を実装するため




## Sprockets3のサポート

### Rails4:
config/initializers/assets.rbでどのアセットをプリコンパイルするか指定
### Rails5:
app/assets/config/ディレクトリ内のmanifest.jsで指定します。
プリコンパイル対象の指定方法が変更になりました。Rails4まではconfig/initializers/assets.rbでしたが、Rails5ではapp/assets/config/manifest.jsとなります。

```
// app/assets/config/manifest.js
//
//= link_tree ../images
//= link_directory ../javascripts .js
//= link_directory ../stylesheets .css
```

※Rails 5.1ではSprockets4が標準となります。

## railsコマンドへの統一
rakeコマンドがrailsコマンドに統一されます。

### Rails4
rake db:migrate

### Rails5
 **rails db:migrate** で実行できるようになります。

## orメソッド
クエリ関連のメソッドです。
その1つとしてorができます！読んだ通りの挙動をします。

```
例) User.where(id: [1,2]).or(User.where(name: "Mike"))
```

#saveメソッドのtouchオプションが追加
saveメソッドでtouchオプションを指定するとタイムスタンプを更新しないようにすることができます。タイムスタンプを更新したくないケースは割りと良くあると思いますが、より簡単にできるようになりました。

## pluckとwithoutメソッド

### pluckメソッド
特定のレコードのカラムを配列にする#pluckメソッドと似た挙動のメソッドがハッシュの配列でも使えるようになりました。

```
[{ name: "Tom" }, { name: "Jack" }, { name: "Mike" }].pluck(:name)
=> ["Tom", "Jack", "Mike"]
```

### withoutメソッド
配列の中から特定の要素を除く#withoutメソッドが追加されました。

```
people = ["Jack", "George", "Jackson", "Ted"]
people.without "Ted", "Jackson"
=> ["Jack", "George"]
```


Enumerableモジュールにpluckとwithoutが追加されました。#pluckはActiveRecordではおなじみでしたが、Enumerableにも追加されました。個人的にはインターフェイスが揃うことは好ましいことだと思っています。

## アソシエーションに関して
has_many :throughがeager loadingするとき、joinするモデルのorderが正しく動作するようになります。
下記の例だとcategoriesがeager loadingされるとき、by_orderのorderになります。

```
class Article < ActiveRecord::Base
  has_many :by_order, -> { order(:genre) }
  has_many :categories, through: :by_order
end
```

# 最後に
見慣れないメソッドばかりかもしれませんが、Rails4よりもRails5になったことで少しだけ便利になりました。
今後プログラミングを始める方はより敷居が下がり、サービスを作れる人は多くなってきます。
ただコードの品質を保つことも重要なことです。ただ単にコードをかくのでなく、Rails5など常に新しい情報をキャッチアップしながらその時に最適なコードを書いていきましょう。


# 参考サイト
- [Rails 5.1で標準となるSprockets 4について](http://qiita.com/ryohashimoto/items/aa2a7065abc6a4dcedd1)
- [今から知っておきたいRails 5の新機能・変更点](http://qiita.com/ryohashimoto/items/09724ad4dddcda01bce3)