先日、resourcesとresourceの違いについてまとめてみましたが、組み合わせて使う際の注意点もあったのでまとめてみました。
違いについてはこちら → resourcesとresourceの違い - Qiita
resourcesとresourceを組み合わせて使う場合
resourcesとresourceを組み合わせて使うと、下記のようなルーティングが簡単に生成できます。
- 全ユーザーの一覧表示
- 全ユーザーの詳細表示
- 自ユーザーの詳細表示
- 自ユーザー情報の編集
全ユーザー一覧、各ユーザーの詳細については、誰でも表示できるが、ユーザー情報の編集は自分のものしかできないという状態。
resources :users, only: [:index, :show]
resource :user, only: [:show, :edit, :update]
rails routes
で生成されたルートを確認すると、下記のような感じ。
Prefix Verb URI Pattern Controller#Action
users GET /users(.:format) users#index
user GET /users/:id(.:format) users#show
edit_user GET /user/edit(.:format) users#edit
GET /user(.:format) users#show
PATCH /user(.:format) users#update
PUT /user(.:format) users#update
user GET /users/:id(.:format) users#show
の部分、user_pathが/users/:idに割り当てられてしまうことで、/userを返すべきヘルパーメソッドが生成されない。
ということで、順番を逆にして記載してみた。
resource :user, only: [:show, :edit, :update]
resources :users, only: [:index, :show]
rails routes
で生成されたルートを確認すると、下記のような感じ。
Prefix Verb URI Pattern Controller#Action
edit_user GET /user/edit(.:format) users#edit
user GET /user(.:format) users#show
PATCH /user(.:format) users#update
PUT /user(.:format) users#update
users GET /users(.:format) users#index
GET /users/:id(.:format) users#show
自ユーザーは、ログイン機能(session管理)で特定できれば、リクエストに:idを含む必要はないので、自ユーザーに関するルーティングはresource
を使用しています。
自分以外のユーザーの詳細画面を見るには、対象となるユーザーのIDを指定する必要があるので、resources
でリクエストに:idを含むルートを生成しています。
結論
単数形で使用するresource
と、複数形で使用するresources
を組み合わせてルーティングを作る際は、単数形のresource
を上に書くようにする。