0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[Rails] 単数形リソースについて

Posted at

[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アクションのみを宣言したいと思います。

config/routes.rb
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を参照する必要のないけどリソースを扱いたいことがいろんなところであると思いますので参考になればと思います。

参考にしたサイト

Railsガイド

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?