基礎Ruby on Rails Chapter5 RESTとルーティング

前 [基礎Ruby on Rails Chapter4 データの保存](https://qiita.com/tseno/items/38fb7e743be58cc360b4)
次 [基礎Ruby on Rails Chapter5 7つのアクション](https://qiita.com/tseno/items/4c107bf53ca80613ffea)

# RESTとルーティング

## リソースレベルのルーティング

### RESTとリソース

- リソースを追加するには、`resouce`のあとに、リソース名の複数形を指定する。
- これだけで7つのアクションのルーティングが設定できる。

```rb:config/routes.rb
resouces :members
```

### リソースを扱うコントローラ、パスとHTTPメソッド

|アクション|内容|パス|HTTPメソッド|
|:--|:--|:--|:--|
|index|一覧|/members|GET|
|new|作成のためのフォームを表示する|/members/new|GET|
|create|作成をする|/members/|POST|
|show|内容を表示|/members/123|GET|
|edit|更新のためのフォームを表示する|/members/123/edit|GET|
|update|更新する|/members/123|PATCH|
|destroy|削除する|/members/123|DELETE|

### アクションの追加

- `:collection`は、一覧の時に使う。
- `on:`を使う書き方。

```rb:config/routes.rb
  resouces :members do
    # 一覧にsearchアクションを追加する
    get "search", on: :collection
    # メンバーの停止・再開を追加する
    patch "suspend", "restore", on: :member
  end
```

- ブロックで囲む書き方

```rb:config/routes.rb
  resouces :members do
    # 一覧にsearchアクションを追加する
    collection { get "search" }
    # メンバーの停止・再開を追加する
    member { patch "suspend", "restore" }
  end
```

- 追加されたアクション

|アクション|内容|パス|HTTPメソッド|
|:--|:--|:--|:--|
|search|検索|/members/search|GET|
|suspend|停止|/members/123/suspend|PATCH|
|restore|再開|/members/123/restore|PATCH|

- 7つのアクションで、限定や除外をするには、`only:`、`except:`を使う

```rb:config/routes.rb
  # indexとshowのルーティングだけ設定する
  resouces :members, only: [:index, :show]
  # destroy以外の6つのアクションのルーティングを設定する
  resouces :members, except: [:destroy]
```

## リソースとパスの指定

### パスを返すメソッド

- リソースの集合を扱うindexとcreateでは、members_pathのように、複数形になる。

|アクション|内容|戻り値の例|HTTPメソッドパスを返すメソッド|
|:--|:--|:--|:--|
|index|一覧|/members|members_path|
|new|作成のためのフォームを表示する|/members/new|new_member_path|
|create|作成をする|/members/|members_path|
|show|内容を表示|/members/123|member_path(member)|
|edit|更新のためのフォームを表示する|/members/123/edit|edit_member_path(member)|
|update|更新する|/members/123|member_path(member)|
|destroy|削除する|/members/123|member_path(member)|

- 一覧ページ(index)のリンクは次のようになる。

```rb
link_to "会員一覧", members_path
```

- showやeditのように個別リソースを扱うアクションへのリンクはモデルオブジェクトを渡す。

```rb
link_to @member.name, member_path(@member)
```

- member_path(member)は複数のアクションで使われるが、アクションの区別はHTTPメソッドで行う。
- 削除→delete、更新→patch、表示→get
- 一覧→get、作成→post

```rb
link_to "削除", member_path(@member), method: :delete
```

- アクションを追加したときは、次のメソッドがパスを返すようになる。

|アクション|内容|パス|HTTPメソッド|パスを返すメソッド|
|:--|:--|:--|:--|:--|
|search|検索|/members/search|GET|search_members_path|
|suspend|停止|/members/123/suspend|PATCH|suspend_member_path|
|restore|再開|/members/123/restore|PATCH|restore_member_path|

- members_pathを`members_url`にすると、http://から始まるURLを返す。

### オブジェクトでパスを返す

- link_toメソッドの第2引数にモデルオブジェクトを渡すと、member_pathメソッドと同じパスに変換される。

```ruby
# /members/123 (GET) 
link_to member.name, @member
# /members/123 (DELETE)
link_to "削除", @member, method: :delete
```

- 個別のリソースを使うアクションは、配列を使って[:アクション名, オブジェクト]で表す。

```ruby
# /members/123/edit (GET)
link_to "編集", [:edit, @member]
# /members/123/suspend (PATCH)
link_to "停止", [:suspend @member], method: :patch
```

- indexやnewのように、idをとらないアクションは、_pathを取った文字列をシンボルにしたものが使える。

```ruby
# /members/ (GET)
link_to "会員一覧", :members
# /members/new (GET)
link_to "新規追加", :new_member
```

参考
[改訂4版 基礎 Ruby on Rails (IMPRESS KISO SERIES)](https://www.amazon.co.jp/%E6%94%B9%E8%A8%824%E7%89%88-Ruby-Rails-IMPRESS-KISO/dp/429500460X/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=1536666358&sr=1-1)