そもそもcollectionやmemberってどんなときに使うか?
[結論]
「resourcesでroutingを設定しているとき、resourcesメソッドでは自動で生成されないactionへの
ルーティングを設定するとき」に使用する。
通常RailsのWebアプリケーションの中でルーティングを設定する際には7つのアクションを
自動生成してくれるresourcesメソッドを使用することが多いが、例えば投稿検索機能などを新たに追加で実装する際にはresourcesで設定できる7つのアクション以外にルーティングを生成しなければならない。そこでこういった場合にcollectionやmemberを使用する。
それではcollectionとmemberにはどんな違いがあるか?
[結論]
ルーティングを設定する際に**「:id」を含ませるかどうか**の違い。
| collection | ルーティングに「:id」がつかない |
| member | ルーティングに「:id」がつかない |
【例】collectionで定義した場合
Rails.application.routes.draw do
resources :tweets do
collection do
get 'search'
end
end
end
【例】collectionのルーティング
Prefix Verb URI Pattern
search_tweets GET /tweets/search(.:format) tweets#search
※上記をみると「:id」がついていないのが確認できる。
つまり投稿一覧ページのようにデータを特定する必要がない場合はcollectionでOK!!
【例】memberで定義した場合
Rails.application.routes.draw do
resources :tweets do
member do
get 'search'
end
end
end
【例】memberのルーティング
Prefix Verb URI Pattern
search_tweet GET /tweets/:id/search(.:format) tweets#search
※上記をみると「:id」がついているが確認できる。
つまり詳細ページのようにデータを特定する必要がある場合はmemberを使用!!
まとめ
collectionやmemberはルーティングの設定でresourcesメソッドを使用した際に
新たにアクションを追加したい場合に使用する。
またそのアクションを動かすときにparamsで**「:id」を受け取りたい場合はmemberを使用し、
特にid**を指定して特定のページにいく必要がない場合は、collectionを使用してアクションを追加する。
自分自身検索機能を入れた時に使用したこの部分の概念がとても難しいと感じ、
よく理解できていなかったが、再度調べてなおして学習してみると意外と悩まず理解することができました。
********************************************
参考記事
railsのroutes.rbのmemberとcollectionの違いをわかりやすく解説してみた。〜rails初心者から中級者へ〜