初学者のプログラミング　memberとcollection

##memberとcollectionについて
```ruby
Rails.application.routes.draw do
  resources :publishers do
    resources :books
    member do
      get 'detail'
    end
    collection do
      get 'search'
    end
  end
end
```
ルーティングの拡張機能として、resourcesでは設定のないルーティングをmemberやcollectionを使用することで設定できる。例ではdetailアクションとsearchアクションをHTTPメソッドのGETで指定した。
##rails routesの実行結果からルーティングの設定をみる
```terminal
                   Prefix Verb   URI Pattern                                                                              Controller#Action
          publisher_books GET    /publishers/:publisher_id/books(.:format)                                                books#index
                          POST   /publishers/:publisher_id/books(.:format)                                                books#create
       new_publisher_book GET    /publishers/:publisher_id/books/new(.:format)                                            books#new
      edit_publisher_book GET    /publishers/:publisher_id/books/:id/edit(.:format)                                       books#edit
           publisher_book GET    /publishers/:publisher_id/books/:id(.:format)                                            books#show
                          PATCH  /publishers/:publisher_id/books/:id(.:format)                                            books#update
                          PUT    /publishers/:publisher_id/books/:id(.:format)                                            books#update
                          DELETE /publishers/:publisher_id/books/:id(.:format)                                            books#destroy
         detail_publisher GET    /publishers/:id/detail(.:format)                                                         publishers#detail
        search_publishers GET    /publishers/search(.:format)                                                             publishers#search
               publishers GET    /publishers(.:format)                                                                    publishers#index
                          POST   /publishers(.:format)                                                                    publishers#create
            new_publisher GET    /publishers/new(.:format)                                                                publishers#new
           edit_publisher GET    /publishers/:id/edit(.:format)                                                           publishers#edit
                publisher GET    /publishers/:id(.:format)                                                                publishers#show
                          PATCH  /publishers/:id(.:format)                                                                publishers#update
                          PUT    /publishers/:id(.:format)                                                                publishers#update
                          DELETE /publishers/:id(.:format)                                                                publishers#destroy
```
７つのアクションの他に、publishers#detailsとpublishers#searchが追加されている。このように基本アクション以外のアクションを任意で設定することができる。

##memberとcollectionの使い分け
設定状況を見ると
`detail_publisher GET    /publishers/:id/detail(.:format)                                                         publishers#detail`
`search_publishers GET    /publishers/search(.:format)                                                             publishers#search`
URIに`/:id`の有無に違いがある。detailsアクションを設定したmemberでは`/:id`があるため個別のリソース(データ)へのルーティングが設定でき、searchアクションを設定したcollectionでは`/:id`がないため、全体リソースへのルーティングを設定している。

##まとめ
detailsは１つのデータの詳細を表示するshowのような役割だから`/:id`を設定し個別に対応する必要があり、searchは全体から検索するわけだから、`/:id`の必要がなく、全体に対するアクションとなる。全体へのアクションなのか、個別に対応させるアクションなのかを考えて使い分ける必要がある。

## さいごに
プログラミングの初学者です。その日に学んだことを学習の一環としてアウトプットしています。より深く学習していきたいと考えておりますので、ご指摘等いただけますと幸いです。

参考図書：パーフェクト Ruby on Rails【増補改訂版】すがわらまさのり/前島真一/橋立友宏/後藤優一/五十嵐邦明