resourcesとresource
ルーティングの設定をする際、脳死でresources
を使っていてresource
との違いがよく分からなかったので2つの違いやどう使い分けるかを調べてみました。
違い
- resourcesは7つのアクションのルーティングをid付きで生成する
- resourceはindex以外のルーティングをidなしで生成する
実際にルーティングを確認してみます。
Rails.application.routes.draw do resources :users end
とすると
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
こんなルーティング になります。
Rails.application.routes.draw do resource :user end
だと
Prefix Verb URI Pattern Controller#Action new_user GET /user/new(.:format) users#new edit_user GET /user/edit(.:format) users#edit user GET /user(.:format) users#show PATCH /user(.:format) users#update PUT /user(.:format) users#update DELETE /user(.:format) users#destroy POST /user(.:format) users#create
こうなりました。
resourceの方は
- indexがない
- idがない
ことがわかります。
使い分け
ではこの2つをどのように使い分ければ良いでしょうか。
resourcesはidが付与されているので、複数あるリソースからidを使って特定のリソースを絞り込む必要がある時に使います。
例えば「投稿」は複数存在し、それぞれ個別のidが必要です。そんな時は複数形のresourcesを使います。
resourceはidが付与されていないので、リソースを絞り込む必要がない時に使います。
例えば「ログインユーザー」は自分から見て常に自分1人であり、そのためindexも要らないし、わざわざidを付与する必要もないため単数形のresourceを使います。
最後に
実際はここまで単純ではなくオプションを付けたりネストしたりすることが多そうですが、ほんとの基本の部分はこんな感じだと思います。
僕自身、まだ使い分けに慣れてませんがRESTfulなルーティングを心掛けたいです。
ご指摘ありましたらコメント頂けると幸いです。