LoginSignup
0
0

More than 3 years have passed since last update.

resourcesとresourceを組み合わせて使う時の注意点についてまとめてみた

Last updated at Posted at 2020-07-31

先日、resourcesとresourceの違いについてまとめてみましたが、組み合わせて使う際の注意点もあったのでまとめてみました。
違いについてはこちら → resourcesとresourceの違い - Qiita

resourcesとresourceを組み合わせて使う場合

resourcesとresourceを組み合わせて使うと、下記のようなルーティングが簡単に生成できます。

  • 全ユーザーの一覧表示
  • 全ユーザーの詳細表示
  • 自ユーザーの詳細表示
  • 自ユーザー情報の編集

全ユーザー一覧、各ユーザーの詳細については、誰でも表示できるが、ユーザー情報の編集は自分のものしかできないという状態。

config/routes.rb
  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を返すべきヘルパーメソッドが生成されない。
ということで、順番を逆にして記載してみた。

config/routes.rb
  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を上に書くようにする。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0