テクノロジー
2016年11月3日Railsのルーティングを学ぼう②
この記事ではRuby on Railsのルーティングの基礎的な部分を学んでいきます。
今回はルーティングを生成するのに便利なオプションmember
、collection
を学んでいきます。
Railsのルーティングを学ぶ
ルーティング① ではRuby on Railsにおけるルーティングの基礎に触れ、resourcesで生成されるルーティングなどを見てきました。
今回はルーティングを生成するのに便利なオプションmember
、collection
を学んでいきます。
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つのルーティングの役割ではないルーティングを作成したい!という場合がでてきます。
その場合にcollection
やmember
が役に立ちます。
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をまとめて設定
上記のmember
、collection
の例では一つのルーティングだけに設定できるようにon: :collection
、on: :member
を用いて設定しましたが、下記のようにdo ~ end
のでひとまとまりとして記載すると二つ以上のcollection
、member
のルーティングをまとめて設定できます。
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で生成されるルーティングの他にcollection
、member
で設定したルーティングが生成されます。
このようにcollection do 〜 end
、member do 〜 end
の中に設定したいルーティングを設定することでcollection
やmember
で設定したいルーティングを一気に設定することができます。
collection
やmember
を使わなくてもルーティングは設定することができますが、Ruby on Railsが提供している機能を使用することでRESTfulなルーティングを作っていくことができるので積極的に使用していきましょう。
次回(ルーティング③)ではnamespace
について記載していきます。