はじめに
こんにちは、ソナーのタルイシです。
今回は、Railsで発生したURL生成エラーをきっかけに、ルーティング設計とresourceの使い方を見直した話をまとめます。
エラー箇所と想定
indexメゾットのURL生成を想定
<%= form_with url: properties_maintenance_path, method: :get, data: {turbo: false}, class: "filter-bar" do |f| %>
エラー内容
form_with ヘルパーで指定した URL が Rails のルーティングに存在しないか、必要なパラメータが不足しているため、URL生成ができない。
原因
Rails では resources を使うと、index 用のURLヘルパーを作る際に、自動的に複数形に変換して作成する。
しかし、単純な単語(user → users)は問題ないが、properties_maintenance のようにすでに複数形を含む複合語では正しく変換できず、_index が付いたヘルパー名になる場合がある。
つまり、今回の場合「properties_maintenance_path」 というURLヘルパーが存在しないということだった。
また、properties_maintenance_path(引数なし)は update / show 用で :id が必須なため、「必要なパラメータが不足している」というエラーが表示された。
解決方法
案① 命名慣習に従う
Railsの命名慣習に従い、複数形で命名する。
resources :property_maintenances, only: [:index, :edit, :update, :destroy]
| アクション | 生成されるヘルパー |
|---|---|
| index | property_maintenances_path |
| edit | edit_property_maintenance_path(@property_maintenance) |
案② 画面上の意味と命名の一致を優先する(今回採用)
一方で、画面上の表示やドメインの概念に合わせると、単純に複数形に変換するだけでは自然でない場合がある。
今回の場合、画面の意味として単数形の方がユーザーにも開発者にも直感的であると気づいた。
そのため今回はこっちを採用して修正を行った。
resources :delivery_maintenance, only: [:index, :edit, :update, :destroy]
| アクション | 生成されるヘルパー |
|---|---|
| index | delivery_maintenance_index_path |
| edit | edit_delivery_maintenance_path(@delivery_maintenance) |
✔ 採用理由
画面名やドメイン概念との直感的な一致
コードを読む人が画面との対応をすぐに理解できる
_index が付くこと自体は自然な表現の一部として扱える
今回の気づき
- URLヘルパーの命名ルールを完全には理解していなかっただけでなく
※複合語の命名は URL ヘルパー名に直接影響するので注意が必要 - 単数形と複数形の命名が設計や可読性にどれほど重要かを理解していなかった
- resource / resources を設計せずに使っていた
まとめ
今回のエラー解決を通して、設計の意図やルーティングの仕組みを以前より深く理解できました。
今後は、命名規則やリソース設計を意識して、可読性・保守性の高いルーティング設計を心がけたいです。
※ この記事は新人研修の一環です
おまけ (resource と resources の違いについて)
resources(複数形)
- 複数レコードを扱う
- indexを含むCRUDアクションを扱う
resource(単数形)
- 「IDで区別する必要がない1件だけのデータ」を扱う
- 常に「その1件」を操作する
- indexを含まないCRUDアクションを扱う
