Railsのルーティングでresoucesだけでなくresouceもとても便利だった話

概要

Railsでバックエンドの設計をしていて、resoucesではうまく表現できないルーティングがありそれが解決できたので共有

問題

設定画面があり、そこでは一覧表示、更新ができるようにするというものであった。 設定は下記のような感じでユーザーに対しては1対1のテーブルとなってます。

name type
id int
user_id int
setting1 boolean
setting2 boolean

一覧と更新であればRailsのresoucesを使えばいいじゃないか!と思ったのですがそうすると

resources , %i[index update]
メソッド パス アクション
GET /settings settings#index
PATCH/PUT /settings/:id settings#update

このように、patchの方がパスパラメータにIDを欲してくるんですね。 でも特にパスパラメータで渡すものがないので

resources , %i[index]
patch setting_update, 'settings#update'

このような選択肢も考えたのですが…いけてないですね。

解決策

そこで単一リソースについてルーティングできないのかなと調べていたらあるじゃないですか!! その名もresouce

この子を使うとさっきの問題が解決します。

resource , %i[show update]
メソッド パス アクション
GET /settings settings#show
PATCH/PUT /settings settings#update

resourceはindexはないですが、他のアクションは全て持っているので汎用性も高いかなと思います!

参考文献 2.5 単数形リソース Rails のルーティング - Railsガイド