WeBlog

Webに関する情報を中心に発信してるブログ

resorceとresorcesの違いについて

ルーティングを設定するときによく使うのがresorcesという複数形のルーティングです。

しかし、ルーティングにはresourceという単数系のものもあります。

この2つの違いについて書いていきます。

resourcesメソッド

Rails.application.routes.draw do
  resources :profiles
end

resourcesメソッドは、7つのアクション(index、show、new、create、edit、update、destroy)のルーティングを一括で生成してくれるメソッドです。

f:id:weblog_tec:20210503095449p:plain

ターミナルでrails routesと入力すると、上記のように表示されます。

UserBoardCommentに対してresourcesを使うことで/boards/1/boards/1/editのようなルーティングが実現できます。

ちなみにresourcesという複数形を使うときは、profilesのように複数形にします。

resourceメソッド

Rails.application.routes.draw do
  resource :profile
end

f:id:weblog_tec:20210503095507p:plain

resourcesメソッドは7つのアクションのルーティングが「id付き」で生成されました。

しかし、resourceメソッドはルーティングが「idなし」で生成されます。

さらに、resourceメソッドはindexアクションのルーティングが生成されません。

単数系リソースはどんな時に使うのか?

簡単にいうと、idを必要としないリソースで単数系リソースを使います。

例えば、アプリの設定(config)で単数系リソースを使います。

アプリの設定はアプリ内に一つ(1人のユーザーに1つ)しかないので/config/editのようにアクセスした方がいいです。

他にもプロフィール編集画面への遷移も単数系リソースでいいです。

resorcesRailsCRUDに従うと/users/:id/editになりますが、プロフィールの編集というのは自分自身のものに対してしか行いません。

resorcesで書いて、URLにidが含まれているのはわかりづらい気もします。

また、「このidを書き換えたら他人のプロフィールを編集できそう」と容易に想像されてしまうリスクもあります。

1人のユーザーが複数作成できる掲示板(Board)などと異なり、ユーザーに対するプロフィールは1つしか存在しません。

また、他ユーザーのプロフィールを編集することはないので、idを表示させるメリットがないです。

なので単数系リソースで/profile/editというリソースにした方がいいです。

他にもユーザー詳細ページも単数系リソースがいいです。

詳細ページでidを表示させると自分が何番目に作成されたユーザーか分かってしまいます。

詳細ページ(show:/profiles/:id)に他ユーザーのidを入力されてしまうこともあるので、それを防ぐためにも単数形リソースを使うことが望ましいです。

・設定画面

・プロフィール詳細画面

・プロフィール編集画面

などで、単数系リソースを使います。

Railsガイド 単数系リソース

まとめ

アプリケーション内でユーザーがただひとつしか操作できないものを表現するときに単数リソースを使います。 例えば、アカウント情報はそれぞれのユーザーが持っているため複数あるように思えるが、ユーザーは自身のアカウントしか意識できない(=他人のアカウント情報は見えない)し、2つのアカウントを持つこともできない。(ルーティングがprofile/1とかprofile/2とかおかしい) よって、アカウント情報には単数リソースを用います。

反対に、記事などは一人のユーザーが複数作成できるので、普通のリソース(resources)を用います。

たとえば「ユーザーは自分のプロフィール情報のみを確認・編集できる」というシステムの場合には、あらゆるユーザーは確実に、自身のプロフィールただ1つにのみアクセスすることとなり、他人のプロフィールにアクセスする可能性はない。その場合ユーザーのIDの情報はシステム(DB)が内部的に保持していればよく、URLに視認できる状態で含める意味はない。 この場合に単数形リソースを使用することで、通常/profile/:id/editのようになるURLを、/profile/editという形で生成できる。