【Ruby on Rails】resourcesメソッドを使って、ルーティングを自動で作成する。

#はじめに
resourcesメソッドについて、備忘録として残しておきます。

#resourcesメソッド
・`resources`メソッドは**routes.rb**ファイルの中に書き込むメソッドです。
・Railsの基本となる７つのアクションのルーティングをまとめて追加することができます。


#Railsの基本となる７つのアクション
基本となる７つのアクションを以下に記載します。

|アクション|HTTP|役割|URL|
|:-:|:-:|:-:|:-:|
|index|get|リソースの一覧を表示する。|/users|
|show|get|リソースの詳細を表示する。|/users/:id|
|new|get|リソースを新規作成する。|/users/new|
|create|post|リソースを新規作成して、保存する。|/users|
|edit|get|リソースを編集する。|/users/:id/edit|
|update|put/patch|リソースを更新させる。|/users/:id|
|destroy|delete|リソースを削除する。|/users/:id|

#定義の仕方
まずは、resourcesメソッドを定義していない状態でルーティングを確認し、何も定義されていないことを確認します。
  
続いて、以下のように`resources`メソッドを定義していきます。
※「users」の部分には作成したコントローラ名が入ります。今回は**users_controller.rb**を例に行います。

```ruby:routes.rb
Rails.application.routes.draw do
#resourcesメソッド定義する
  resources :users
end
```

定義した後にルーティングを確認すると・・・
基本的な７つのアクションのルーティングが追加されていることがわかります。

```terminal
Prefix    Verb      URI Pattern                  Controller#Action

users     GET       /users(.:format)              users#index
          POST      /users(.:format)              users#create
new_user  GET       /users/new(.:format)          users#new
edit_user GET       /users/:id/edit(.:format)     users#edit
user      GET       /users/:id(.:format)          users#show
          PATCH     /users/:id(.:format)          users#update
          PUT       /users/:id(.:format)          users#update
          DELETE    /users/:id(.:format)          users#destroy
```
#resourcesメソッドのオプション
ここからは、`resources`メソッドのオプションをめもしておきます。

##only
７つのアクションのうち、特定のアクションのみを指定したい時に使用できます。

```ruby:routes.rb
Rails.application.routes.draw do
#createアクションとnewアクションのみ
  resources :users, only:[:create, :new]
end
```
ルーティングを見てみると、こんな感じになっています。

```terminal
          POST      /users(.:format)              users#create
new_user  GET       /users/new(.:format)          users#new
```
##memeber
`member`メソッドは、７つのアクション以外のアクションを追加することができます。
まずは、定義方法について、以下記載します。

```ruby:routes.rb
Rails.application.routes.draw do
#memberメソッドの定義方法
  resources :users do
    member do
      get :following, :followers
    end
  end
```
このように定義することで、７つのアクション以外に以下のようなルーティングが得られます。
`member`メソッドでは、**idで指定した個々のリソース**に対するアクションを定義できます。

```terminal
Prefix            Verb      URI Pattern                       Controller#Action

following_user    GET       /users/:id/following(.:format)    users#following
followers_user    GET       /users/:id/followers(.:format)    users#followers
users             GET       /users(.:format)                  users#index
                  POST      /users(.:format)                  users#create
new_user          GET       /users/new(.:format)              users#new
edit_user         GET       /users/:id/edit(.:format)         users#edit
user              GET       /users/:id(.:format)              users#show
                  PATCH     /users/:id(.:format)              users#update
                  PUT       /users/:id(.:format)              users#update
                  DELETE    /users/:id(.:format)              users#destroy
```


##collection
`collection`メソッドも`member`メソッドと同様に７つのアクション以外のアクションを追加することができます。
`member`メソッドと違う点は、`collection`メソッドは**リソース全体に対するアクション**を定義するという点です。

定義方法も`member`メソッドと同様です。

```ruby:routes.rb
Rails.application.routes.draw do
#collectionメソッドの定義方法
  resources :users do
    collection do
      get :following, :followers
    end
  end
```
ルーティングを見てみると、`member`メソッド同様７つのアクション以外に追加されていることがわかります。
が、`URI Pattern`の箇所が異なります。
`collection`メソッドの方は、全てのリソースに対してアクションを定義しているので**:/id**の部分が省略されています。

```terminal
Prefix            Verb      URI Pattern                       Controller#Action

following_user    GET       /users/following(.:format)    users#following
followers_user    GET       /users/followers(.:format)        users#followers
users             GET       /users(.:format)                  users#index
                  POST      /users(.:format)                  users#create
new_user          GET       /users/new(.:format)              users#new
edit_user         GET       /users/:id/edit(.:format)         users#edit
user              GET       /users/:id(.:format)              users#show
                  PATCH     /users/:id(.:format)              users#update
                  PUT       /users/:id(.:format)              users#update
                  DELETE    /users/:id(.:format)              users#destroy
```
**【2つのメソッドの比較】**

```terminal
Prefix            Verb      URI Pattern                       Controller#Action

##memberメソッド
following_user    GET       /users/:id/following(.:format)    users#following
followers_user    GET       /users/:id/followers(.:format)    users#followers

##collectionメソッド
following_user    GET       /users/following(.:format)        users#following
followers_user    GET       /users/followers(.:format)        users#followers

```


#参考文献
Rails tutorial 第７章　ユーザー登録
https://railstutorial.jp/chapters/sign_up?version=4.2

Rails tutorial 第14章　ユーザーをフォローする
https://railstutorial.jp/chapters/following_users?version=6.0#cha-following_users


【Rails】resourcesメソッドを使ってルーティングを定義しよう！
https://pikawaka.com/rails/resources