[Rails]resources, member, collection　ルーティング/名前付きパス/URLの覚え方[初学者向け]

#はじめに
初めまして。ながえもんと申します。
3ヶ月超かけて、ようやくRailsチュートリアルと言う山を登り切ったので、

<ul><li>resourcesで生成されるRESTfulな7つのルーティング</li><li>memberメソッド、collectionメソッドで生成される任意ルーティング</li><li>それらのアクション名、URL、名前付きパス</li></ul>
についてまとめました。

resourcesで生成されるパス/URLは非常に便利な一方で、
「あれ、名前付きパスはuser_path？users_path？」「URLは/users? /user? /:id?」と混乱する場面が多く、何となくモヤモヤしたままチュートリアルを一周してしまった方も多いはずです(…よね？)。

そんな初学者仲間の皆様の参考になれば幸いです。

[環境]
ruby 2.6.3
Rails 6.0.3.4

##RESTfulな7つのルーティング（基礎）
リソース名は、（例によって）users リソースとします。

```ruby:routes.rb
resources :users
```
このコードを実装すると生成される7つのルーティングは、
アクション順でみると

| action名 | HTTPreq | URL | 名前付きパス |
|:--|:--|:--|:--|
|users#index   |GET   |/users   |users_path   |
|users#show   |GET   |/users/:id   |user_path   |
|users#new   |GET   |/users/:id/new   |new_user_path   |
|users#create   |POST   |/users   |users_path   |
|users#edit   |GET   |/users/:id/edit   |edit_user_path   |
|users#update   |PATCH/PUT   |/users/:id   |user_path   |
|users#destroy   |DELETE   |/users/:id   |user_path   |

こうですね。
（※アクション名は コントローラ名#アクション名 と言う記法に倣っています）

7つのアクション名とその順番に関しては、…頑張って覚えましょう。
ちょっとした覚えるコツとしては、
indexとshowはペア。indexはuserの集合(全体)を、showはuserの個体を「表示する機能」としてまとめて覚えましょう。
newとcreateもペア。newテンプレートのフォームに入力した情報を基に、createアクションに繋げてuserインスタンスを生成する事が多いでしょう。
editとupdateもペア。editテンプレートのフォームに入力した情報を基に、updateアクションに繋げてuserインスタンスの情報を更新する事が多いでしょう。
最後にdestroy。これはペアがいない孤独なアクション君です。

##URLと名前付きパスの関係
次に、URLや名前付きパスの2つの命名ルールを理解しましょう。

【ルール①】 /:id の有無で分類
まず前提として、URLは/users で始まります。ここは複数形で統一です。
その後ろに/:idが有るか無いかで分類します。

/:idなしの時→ 名前付きパスは「複数形」の<strong>users</strong>\_path
/:idありの時→ 名前付きパスは「単数形」の<strong>user</strong>\_path


【ルール②】 URLの後ろに付くオプションは、名前付きパスでは文頭に
ここで言うオプションとは、 

/users/○○
/users/:id/○○

上の○○部分。

このパターンのURLの名前付きパスはルール①も踏まえて

<strong>オプション名</strong>\_users\_path　または
<strong>オプション名</strong>\_user\_path　となります。

このように、頭にオプション名がくると言うルールで命名されています。

以上の2つのルールが分かれば、
/users/:id/new の名前付きパスは new_user_path

同様に
/users/:id/edit の名前付きパスは edit_user_path

となる事が理解できますね。

（この法則は、後で出てくるmemberやcollectionで生成する任意ルーティングにも当てはまりますので、覚えておきましょう！）

##名前付きパスから7つのルーティングを再整理
今度は、今覚えた名前付きパスごとにルーティングを再整理しましょう。

| 名前付きパス | HTTPreq | URL | 反応するaction |
|:--|:--|:--|:--|
|users_path   |GET   |/users   |users#index   |
|〃   |POST   |/users   |users#create   |
|new_user_path   |GET   |/users/:id/new   |users#new   |
|edit_user_path   |GET   |/users/:id/edit   |users#edit   |
|user_path   |GET   |/users/:id   |users#show   |
|〃   |PATCH/PUT   |/users/:id   |users#update   |
|〃   |DELETE   |/users/:id   |users#destroy   |

こうなります。

indexとcreateの２つがusers_path。
これはuserの集合（コレクション）に対するアクションと覚えましょう。
index：コレクション全体を表示する
create：コレクション全体に、1個インスタンスを加える

あとの５つはuser_pathがベースになります。
newとeditは先ほど見たようにオプション付きの名前付きパスですね。

このように2つの方向から整理すると、だいぶ理解も深まって来たでしょうか。

ちなみに、$ rails routes を実行した際にはこちらの「名前付きパスごと」にルーティングが表示されるので、じっくり眺めてみると更に理解が深まるでしょう。


##memberメソッドとcollectionメソッド
次に、usersリソースに任意のルーティングを加えるmemberメソッド、collectionメソッド
この2つのメソッドが生成するURLと名前付きパスについても見ていきましょう。

これらは、resources :users にブロックとして渡します（ネストします）。

```ruby:routes.rb
resources :users do
  member do
    get :foo, :bar
  end
  collection do
    get :hogehoge
  end
end
```

各メソッドの特性：
memberメソッドは、「user_path」に対してアクションを追加。
collectionメソッドは、「users_path」に対してアクションを追加。

メソッドの書き方：
get :foo, :bar　の行に注目して下さい。
「HTTPリクエストの型 :任意アクション名, :任意アクション名 」と言う書き方になります。
※アクション名は複数渡すことも可能です。

上の例では、users#foo, users#bar, users#hogehoge
と言う３つのアクション(メソッド)が生成されました。

各アクションに対応するルーティングは、

<b>『アクション名＝URLや名前付きパスのオプション』</b>

と考えると分かりやすいです。
オプションですから、URLでは「後ろ」に、名前付きパスでは「文頭」に来るルールでしたね。

生成されたfooアクション、barアクション、hogehogeアクションを含めて
名前付きパスごとにルーティングを整理し直します。

今の皆様方であれば、なぜこのような名前付きパスになるのか。
なぜこのようなURLなのか、理解できるはずです。


| 名前付きパス | HTTPreq | URL | 反応するaction |
|:--|:--|:--|:--|
|hogehoge_users_path   |GET   |/users/hogehoge   |users#hogehoge   |
|foo_user_path   |GET   |/users/:id/foo   |users#foo   |
|bar_user_path   |GET   |/users/:id/bar   |users#bar   |
|users_path   |GET   |/users   |users#index   |
|〃   |POST   |/users   |users#create   |
|new_user_path   |GET   |/users/:id/new   |users#new   |
|edit_user_path   |GET   |/users/:id/edit   |users#edit   |
|user_path   |GET   |/users/:id   |users#show   |
|〃   |PATCH/PUT   |/users/:id   |users#update   |
|〃   |DELETE   |/users/:id   |users#destroy   |

以上となります。

最後までお付き合い頂きありがとうございました。
拙い内容だったかと思いますが、
本記事が少しでも名前付きパスで混乱していた方の助けになれば幸いです。


またよろしくお願いいたします:runner:

ながえもん