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なルーティングを心掛けたいです。
ご指摘ありましたらコメント頂けると幸いです。