Railsルーティング:memberとcollectionでカスタムアクションを追加する方法【初心者向けガイド】
生徒
「Railsのルーティングで、普通の7アクション以外に何か追加する方法ってあるんですか?」
先生
「ありますよ。それにはmemberやcollectionという書き方を使います。」
生徒
「その2つはどう違うんですか?見た目が似てて混乱します…」
先生
「それでは、それぞれの意味と使い方をわかりやすく解説していきましょう!」
1. Railsのカスタムアクションとは?
Railsのルーティングでは、resourcesを使うことで、CRUDと呼ばれる基本的な7つのアクション
(index、show、new、create、edit、update、destroy)が自動的に用意されます。
初心者のうちは、この7つを使うだけでも十分にアプリを作れます。
しかし、実際にアプリを作り始めると、「いいねを押す」「フォローする」「一覧を条件で絞り込む」など、 基本の7アクションには当てはまらない処理が必要になることが多くあります。 こうした標準以外の処理を追加したいときに登場するのが、Railsのカスタムアクションです。
カスタムアクションは、既存のresourcesの中に追加して定義します。
その際に使われるのがmemberとcollectionという書き方です。
どちらも「独自のURLとアクションを追加するための仕組み」ですが、
操作の対象が1件なのか、全体なのかで使い分けます。
# カスタムアクションを追加する基本イメージ
resources :articles do
# ここにmemberやcollectionを書く
end
このように、Railsではルーティングの段階で「どんなURLで、どの処理を呼び出すか」を明確に決めます。 カスタムアクションを正しく理解しておくと、URL設計が分かりやすくなり、 コントローラやビューの役割も整理しやすくなります。 次のセクションでは、memberとcollectionの違いを具体的に見ていきましょう。
2. memberとcollectionの違いとは?
memberとcollectionは、どちらもRailsのルーティングでカスタムアクションを追加するための書き方ですが、
最大の違いは「URLにIDが含まれるかどうか」です。
ここを意識すると、迷いにくくなります。
- member:特定の1件に対する操作(URLに
:idが含まれる) - collection:一覧や全体に対する操作(URLに
:idは含まれない)
たとえば「この記事をいいねする」「この記事を非公開にする」といった処理は、
どのデータを操作するかを特定する必要があるため、memberを使います。
URLの中にIDが入ることで、「対象が1つに決まる」仕組みになっています。
一方で、「人気記事一覧を見る」「新着記事をまとめて表示する」などは、
特定の1件ではなく全体に関係する処理です。
このような場合はcollectionを使い、IDを指定しないURLを作ります。
# memberとcollectionの使い分けイメージ
resources :articles do
member do
post :like
end
collection do
get :popular
end
end
「1つの記事を見る・操作するならmember」「一覧やまとめを見るならcollection」 という感覚で覚えておくと、Railsのルーティング設計がスムーズになります。 まずはURLにIDが必要かどうかを考えるのがおすすめです。
3. memberを使ったカスタムアクションの例
ここではmemberを使って、記事に「いいね」を付けるカスタムアクションを追加してみます。
memberの特徴は、特定の1件を指定して処理することです。
そのためURLには必ず:idが入り、「どの記事に対して実行するのか」をはっきりさせます。
イメージとしては、記事一覧の中から1つ選んでボタンを押す感じです。
たとえば「この記事だけにいいねしたい」というとき、対象の記事を決めないと処理できませんよね。
その「対象を決めるための目印」が:idだと思うと分かりやすいです。
resources :articles do
member do
post :like
end
end
このように書くと、次のようなルーティングが追加されます。
POSTになっているのは、「いいね」で状態が変わる(データを書き換える)ためです。
POST /articles/:id/like → articles#like
:idが含まれていることがポイントです。「どの記事をいいねするのか?」を明確に指定する必要があるからです。
たとえば記事IDが5なら、URLは/articles/5/likeのようになります。
こうしておくと、ルーティングを見ただけで「1件に対する操作なんだな」と判断できるので、後から見返しても迷いにくくなります。
# 参考:URLのイメージ(idが5の記事にいいねする)
# POST /articles/5/like
4. collectionを使ったカスタムアクションの例
次はcollectionの例です。collectionは、特定の1件ではなく一覧(全体)に対して行う処理を追加したいときに使います。
そのためURLに:idは付かず、「どれか1つの記事」ではなく「記事全体」に関係するアクションだと分かる形になります。
たとえば「人気記事だけを表示する」「最近の投稿をまとめて見る」「検索結果の一覧を出す」といった機能は、
どれも最初から1件に絞れないのでcollection向きです。
初心者の方は、一覧ページに追加するボタンやリンクはcollectionが多いと覚えると判断しやすくなります。
resources :articles do
collection do
get :popular
end
end
このようにすると、次のルートが追加されます。GETになっているのは、人気記事を「表示するだけ」で、基本的にデータを変更しないからです。
GET /articles/popular → articles#popular
このURLには:idがありません。なぜなら、個別の記事ではなく、全体に関する処理だからです。
たとえば、メニューに「人気記事」というリンクを置く場合も、/articles/popularのようにシンプルなURLにできます。
「IDがない=一覧や条件付き一覧の処理」と考えると、ルーティングを見た瞬間に役割がつかめます。
# 参考:URLのイメージ(人気記事一覧を表示する)
# GET /articles/popular
5. 複数のカスタムアクションを追加する
memberやcollectionの中に、複数のアクションを追加することもできます。
resources :articles do
member do
post :like
post :unlike
end
collection do
get :popular
get :recent
end
end
このように、読みやすく整理して書くことで、ルートが見やすくなります。
6. どのHTTPメソッドを使うべき?
Railsではアクションの内容によって、HTTPメソッドを選ぶ必要があります。
GET:データを取得する(例:一覧表示)POST:データを作成・実行する(例:いいね、検索)
たとえば、「いいね」は何かの状態を変えるのでPOSTにするのが適切です。
7. カスタムアクション設計のポイント
カスタムアクションを設計する際のポイントは次の通りです。
- 個別データに対する操作は
member - 全体に関わる操作は
collection - アクション名は機能を簡潔に表す名前にする
- できるだけRESTの原則に沿うように考える
こうすることで、コードの見通しが良くなり、チームでの開発もスムーズになります。