テクノロジー

2016年11月3日

Railsのルーティングを学ぼう②

Railsのルーティングを学ぶ

ルーティング① ではRuby on Railsにおけるルーティングの基礎に触れ、resourcesで生成されるルーティングなどを見てきました。

今回はルーティングを生成するのに便利なオプションmembercollectionを学んでいきます。

resourcesのルーティング再確認

Rails.application.routes.draw do
  resources :blogs
end

上記のようにルーティングを設定すると

ルーティング アクション HTTPメソッド 説明
/blogs(.:format) index GET 一覧画面生成
/blogs(.:format) create POST 登録
/blogs/new(.:format) new GET 登録画面生成
/blogs/:id/edit(.:format) edit GET 編集画面生成
/blogs/:id(.:format) show GET 詳細画面生成
/blogs/:id(.:format) update PUT 更新
/blogs/:id(.:format) destroy DELETE 削除

7つのルーティングが一気にできます。
基本的にはこの7つでルーティングを表現することが望ましいです。
ただこの7つのルーティングの役割ではないルーティングを作成したい!という場合がでてきます。
その場合にcollectionmemberが役に立ちます。

collection

例えばblogの検索ページを表示するようなルーティングを作りたいといった場合にcollectionが有効です。

早速ルーティングを記載してみます。

Rails.application.routes.draw do
  resources :blogs do
    get :search, on: :collection
  end
end

この状態でrake routesをしてみると

      Prefix                 Verb               URI Pattern                     Controller#Action
      search_blogs      GET        /blogs/search(.:format)            blogs#search
      blogs                  GET         /blogs(.:format)                        blogs#index
                                 POST      /blogs(.:format)                        blogs#create
      new_blog           GET         /blogs/new(.:format)                blogs#new
      edit_blog            GET         /blogs/:id/edit(.:format)           blogs#edit
      blog                   GET          /blogs/:id(.:format)                  blogs#show
                                PATCH      /blogs/:id(.:format)                  blogs#update
                                PUT          /blogs/:id(.:format)                  blogs#update
                                DELETE    /blogs/:id(.:format)                  blogs#destroy

resourcesで生成されるルーティングの他に

search_blogs GET    /blogs/search(.:format)   blogs#search

というルーティングができていると思います。
こうすることでblogを検索できるような画面へのルーティングができました。
このようにidの指定をしないような基本CRUD以外のルーティングを設定したい場合はcollectionでルーティングを設定します。
あとはこの検索のルーティングに検索ワードとなる値を渡せば簡易的な検索機能が実装できます。

例: titleがrailsのものを検索したい時
/blogs/search?title=rails
あとはコントローラでtitleのパラメータを受け取りデータを取得する

member

例えば特定のblogをお気に入りにできるような機能をつけたいとなった時にはmemberが有効です。

Rails.application.routes.draw do
  resources :blogs do
    get :favorite, on: :member
  end
end

この状態でrake routesしてみると

       Prefix Verb                             URI Pattern                     Controller#Action
      favorite_blog      GET         /blogs/:id/favorite(.:format)     blogs#favorite
      blogs                  GET         /blogs(.:format)                        blogs#index
                                 POST      /blogs(.:format)                        blogs#create
      new_blog           GET         /blogs/new(.:format)                blogs#new
      edit_blog            GET         /blogs/:id/edit(.:format)           blogs#edit
      blog                   GET          /blogs/:id(.:format)                  blogs#show
                                PATCH      /blogs/:id(.:format)                  blogs#update
                                PUT          /blogs/:id(.:format)                  blogs#update
                                DELETE    /blogs/:id(.:format)                  blogs#destroy

resourcesで生成されるルーティングの他に

favorite_blog GET    /blogs/:id/favorite(.:format) blogs#favorite

というルーティングが出来ています。
これで特定のblogをお気に入りにできるルーティングができました。
このようにmemberを用いることで特定のリソースに対するアクション(idを指定するようなアクション)のルーティングを作成することができます。

collection, memberをまとめて設定

上記のmembercollectionの例では一つのルーティングだけに設定できるようにon: :collectionon: :memberを用いて設定しましたが、下記のようにdo ~ endのでひとまとまりとして記載すると二つ以上のcollectionmemberのルーティングをまとめて設定できます。

Rails.application.routes.draw do
  resources :blogs do     
    collection do              // ここから
      get :search
      get :ranking
    end                            // ここまでがひとまとまり
    
    member do     // ここから 
      get :favorite
      get :preview
    end                           // ここまでがひとまとまり
  end
end

上記のように設定すると

       Prefix        Verb       URI Pattern                   Controller#Action
 search_blogs   GET    /blogs/search(.:format)           blogs#search
ranking_blogs   GET    /blogs/ranking(.:format)            blogs#ranking
favorite_blog    GET     /blogs/:id/favorite(.:format)       blogs#favorite
 preview_blog   GET    /blogs/:id/preview(.:format)       blogs#preview

resourcesで生成されるルーティングの他にcollectionmemberで設定したルーティングが生成されます。

このようにcollection do 〜 endmember do 〜 endの中に設定したいルーティングを設定することでcollectionmemberで設定したいルーティングを一気に設定することができます。

collectionmemberを使わなくてもルーティングは設定することができますが、Ruby on Railsが提供している機能を使用することでRESTfulなルーティングを作っていくことができるので積極的に使用していきましょう。

次回(ルーティング③)ではnamespaceについて記載していきます。

DIVE INTO CODEのことをもっと知ってみませんか?