🧏‍♂️

[routing]collection doとmember doは何が違うの?

2024/08/22に公開

ルーティングを記載しているとき、collection do~で記載したらうまく動かず調べたらmember doで、どっちも見たことあるけどちゃんと説明できないなと思って、、、

collection と member の違い・用途

collection と member は、どちらも Rails のルーティングでカスタムアクションを追加するために使いますが、それぞれの用途と生成されるパスが異なります。

member

  • 特定の 1つのリソース(個別のオブジェクト)に対してアクションを実行する場合に使います。
  • URLにはリソースのidが含まれる
resources :tasks do
  member do
    patch 'update_status'
  end
end

ここで:idは、個別のタスクのIDを示します。
このルーティングは、特定のタスクの状態を変更するときに使う。
この場合、生成されるURLは次のようになります。

URL例
PATCH /tasks/:id/update_status

collection

  • リソース全体に対してアクションを実行する場合に使います(個別のオブジェクトではなく、複数または全体を対象にする場合)。
  • URLにはリソースのidが含まれない
resources :tasks do
  collection do
    get 'search'
  end
end

このルーティングは、特定のタスクではなく、タスク全体に対して検索を実行する場合などに使います。
この場合、生成されるURLは次のようになります。

コード例
GET /tasks/search

まとめ

それぞれのケースに応じて適切な方法を選ぶと、ルーティングがわかりやすくなります。

Discussion