[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 リソースとします。
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 にブロックとして渡します(ネストします)。
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 |
以上となります。
最後までお付き合い頂きありがとうございました。
拙い内容だったかと思いますが、
本記事が少しでも名前付きパスで混乱していた方の助けになれば幸いです。
またよろしくお願いいたします
ながえもん
Author And Source
この問題について([Rails]resources, member, collection ルーティング/名前付きパス/URLの覚え方[初学者向け]), 我々は、より多くの情報をここで見つけました https://qiita.com/Shota-NAGAE/items/7e782437a76bb0aecc7b著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .