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


はじめに

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

  • resourcesで生成されるRESTfulな7つのルーティング
  • memberメソッド、collectionメソッドで生成される任意ルーティング
  • それらのアクション名、URL、名前付きパス

についてまとめました。

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

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

[環境]
ruby 2.6.3
Rails 6.0.3.4

RESTfulな7つのルーティング(基礎)

リソース名は、(例によって)users リソースとします。

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なしの時→ 名前付きパスは「複数形」のusers_path
/:idありの時→ 名前付きパスは「単数形」のuser_path

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

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

上の○○部分。

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

オプション名_users_path または
オプション名_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の2つがusers_path。
これはuserの集合(コレクション)に対するアクションと覚えましょう。
index:コレクション全体を表示する
create:コレクション全体に、1個インスタンスを加える

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

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

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

memberメソッドとcollectionメソッド

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

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

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
と言う3つのアクション(メソッド)が生成されました。

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

『アクション名=URLや名前付きパスのオプション』

と考えると分かりやすいです。
オプションですから、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

以上となります。

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

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

ながえもん