Ruby on Rails 始めました

Javaやphpはそこそこ書ける程度の人が、Ruby on Railsを一から習得する過程を記したサイト

Rails忘備録

ルーターにおけるresourcesとresourceの違いと組み合わせ方

resourcesとresource

 Railsで何らかのリソースに対するCRUD処理を行うためのルーティングを手っ取り早く生成する方法に、resourcesメソッドとresourceメソッドがある。

 これらの違いについてメモっておく。

resourcesとは

 resourcesは、複数のリソースに対するCRUD処理を行うためのルーティングを生成する。

 例えば、複数の本(books)についてのCRUD処理を行う為のルーティングを生成するにはroutes.rbにおいて、

※リソース名がbooksと複数形になっていることにも注意

とやるだけで、以下のルーティングが生成される。

 urlに:idを含むことで、それぞれのリソース(book)ごとにCRUD処理を行うことができる。

 リソースが複数なので、/booksに対するGETリクエストが返すのはリソースの一覧画面(indexアクション)であることが分かる。

resourceとは

 resourceは、ただ1つのリソースに対するCRUD処理を行うためのルーティングを生成する。

 例えば、一冊の本(book)についてのCRUD処理を行うためのルーティングを生成するには、routes.rbにおいて、

※リソース名がbookと単数形になっていることにも注意

 とやるだけで、以下のルーティングが生成される。

 こちらの場合は、リソースは1つだけなのでurlに:idを含む必要がない。そして、一覧画面(indexアクション)が必要ないので、/bookに対するGETリクエストはそのリソースの表示(showアクション)であることが分かる。

resourcesとresourceを組み合わせて使う

 たった1つのリソースについてのCRUD処理というのは、実際はそんなに使い所がないと思われる。

 が、resourcesresourceを組み合わすことで、以下のようなルーティングを簡単に作ることができる。

  1. 全user一覧表示
  2. 各user詳細表示
  3. 自user詳細表示
  4. 自user登録フォーム表示
  5. 自user登録処理
  6. 自user編集フォーム表示
  7. 自user編集処理
  8. 自user削除処理

 いわゆる会員サイトのようなものを思い浮かべると分かりやすいと思う。全user一覧、及び各user詳細については誰でも見れるが、user情報の編集などはもちろん自分のものしか出来ない。

 実際は、自userを特定するにはログイン機能(session管理)が必要になるが、とりあえずそれは横へ置いておくとして、上記のようなルーティングをresourcesresourceを組み合わせることによって生成することができる。

 自userは、sessionで特定できさえすれば、リクエストにわざわざ:idを含む必要はないので、自userに関するルーティングはresourceを使っている。

 逆に自分以外のuserについての詳細画面を見る場合は、そのuserのIDを指定しなければならないので、resourcesによってリクエストに:idを含むルーティングを生成している。

 resource :userとしても、コントローラー名はusersであることに注意。
 単発のリソースと複数のリソースを組み合わせることで効率的なコーディングができるように、あえて単発リソース(user)も複数リソース(users)であっても複数形(users_controller)に統合されるようになっているんだと思う。

resourcesとresourceの順番に注意

 resourcesメソッドとresourceメソッドを書く順番には注意が必要。

 ↑これは先程とは順番が逆で、結果的に以下のルーティングが生成される。

 よく見ると、Prefixのところ、パスを返す為のヘルパーメソッドが変わってしまっている。

 user_path/users/:idに割り当てられてしまうことで、/userを返すべきヘルパーメソッドが生成されない?

 resource(単発)とresources(複数)を組み合わせてルーティングを作る際は、resource(単発)を先に書くようにするべき。

コメントを残す




関連記事

Pick Up