【Ruby on Rails】ルーティング member と collection の違い

概要

Rails には index, show, new, edit, create, update, destroy の 7 つのデフォルトアクションが用意されています。

もし、これ以外のアクションを新しく追加したい場合、ルーティングに設定を追記する必要があります。

この場合、routes.rb をどう書くのか調べたところルーティングのメソッドに、member と collection と言うものがありました。

この 2 つの使い方を簡単にまとめました。

member の使い方

member は特定のデータに対するアクションに利用します。

例えば、ユーザーのフォローを行う follow アクションを新しく追加したいとします。

この場合、フォローを行うのは、特定のユーザーです。

『 A さんが B さんをフォローする』の様な処理になると思います。

なので、URL を作成するとしたら、下記の様になります。

特定のユーザーを示す id が含まれていることに注目してください。

http://$(DNS)/users/1/follow

member を使った routes.rb の記載方法は下記の様になります。

$ cat config/routes.rb
Rails.application.routes.draw do
  resources :users do
    post :follow, on: :member
  end
end

collection の使い方

collection は全部のデータに対するアクションに利用します。

例えば、ユーザーの検索を行う search アクションを新しく追加したいとします。

この場合、検索対象は全部のユーザーです。

A さんが検索しても、B さんが検索しても同じ結果になるはずです。

なので、URL を作成するとしたら、下記の様になります。

http://$(DNS)/users/search

collection を使った routes.rb の記載方法は下記の様になります。

$ cat config/routes.rb
Rails.application.routes.draw do
  resources :users do
    get :search, on: :collection
  end
end

まとめ

member と collection の使い方をまとめました。

member は特定のデータに対するアクションに利用します。

collection は全部のデータに対するアクションに利用します。

和訳すると collection は集団、member は (集団の) 一員 みたいな意味なので、そう覚えておけば分からなくならないと思います。