[Rails] 単数形リソースについて
はじめに
Railsは、RESTfulな設計を実現させるために、resourcesメソッドが存在しています。こちらを宣言するだけで、自動でRESTfulなルートとCRUD操作をするためのアクションを結び付けてくれるので大変便利なメソッドです。
ほとんどの場合は、こちらを使っていけばよいのですが、別の選択肢としてresourceメソッド (単数形リソース)というのがあります。今回はこちらについて紹介したいと思います。
使用環境
- Rails 7.0.4
- ruby 3.0.2
単数形リソースを選ぶ基準
単数形リソースを選ぶ基準としては、ユーザーがそのリソースに対して複数のリソースを必要としない場合で使うとよいと思います。
例えば、「商品」(/items)は、アプリを使用するユーザーにとって、複数のリソース(/items/1, /items/2 ...)を扱いたいので、これはresourcesメソッドを宣言するのがよいでしょう。
では、「現在ログインしているユーザのプロフィール」(/profile) ではどうでしょう。ユーザーにとっては、現在ログインしているのは、自分自身しかいません。
複数のプロフィールの一覧を表示するわけではないし、ほかのユーザーを扱う必要がないのでこの場合は、単数形リソース(resource
)で作成するのがよいと思います。
このように、単数形リソースは、ユーザにとってひとつしか存在しないリソースをRESTfulに扱いたい場合に使うのがいいでしょう。
単数形リソースのルーティング定義の仕方
単数形リソースを宣言する方法は、resourcesメソッドとほぼ同様な方法で定義を行います。
例として、profileのshowアクションのみを宣言したいと思います。
resource :profile, only: %i[show]
これで単数形リソースの宣言ができました。 resource
と単数形を宣言すること、profile
とこちらも単数を宣言することに注意してください。
こちらを宣言し rails routes
でルーティングを確認すると、
prefix Verb URI Pattern Controller#Action
profile GET /profile(.:format) profiles/show
のような結果になります。
このように通常であれば、items/:id(.:format)
のようにshowアクションには、idを必要としますが単数形リソースであるため不要となります。また、コントローラは、profilesと複数形になっていますが、これはコントローラは複数形、単数形どちらも同じコントローラに割り当てられるためこのようになっています。
単数形のヘルパーメソッド
ヘルパーメソッドについても複数形と同様に扱えますが、idを持たないため、showアクションなどに引数をとることはできません。そのため profile_path
のように宣言すると、/profile
を返すことになります。
おわりに
今回は、単数形リソースについて説明をしてみました。idを参照する必要のないけどリソースを扱いたいことがいろんなところであると思いますので参考になればと思います。