ネストしたリソース定義
Railsレシピのままなんですけどね。補足的な意味合いで書いてみる。
root/blog/1/entries
みたいな感じで blog_id = 1 にひもづくentryの一覧を表示する画面を作りたいとする。
まず、root.rbに
map.resources :blogs, :has_many=>:entries
と書くことによって、以下が追加される。
blog_entries GET /blogs/:blog_id/entries {:action=>"index", :controller=>"entries"} formatted_blog_entries GET /blogs/:blog_id/entries.:format {:action=>"index", :controller=>"entries"} POST /blogs/:blog_id/entries {:action=>"create", :controller=>"entries"} POST /blogs/:blog_id/entries.:format {:action=>"create", :controller=>"entries"} new_blog_entry GET /blogs/:blog_id/entries/new {:action=>"new", :controller=>"entries"} formatted_new_blog_entry GET /blogs/:blog_id/entries/new.:format {:action=>"new", :controller=>"entries"} edit_blog_entry GET /blogs/:blog_id/entries/:id/edit {:action=>"edit", :controller=>"entries"} formatted_edit_blog_entry GET /blogs/:blog_id/entries/:id/edit.:format {:action=>"edit", :controller=>"entries"} blog_entry GET /blogs/:blog_id/entries/:id {:action=>"show", :controller=>"entries"} formatted_blog_entry GET /blogs/:blog_id/entries/:id.:format {:action=>"show", :controller=>"entries"} PUT /blogs/:blog_id/entries/:id {:action=>"update", :controller=>"entries"} PUT /blogs/:blog_id/entries/:id.:format {:action=>"update", :controller=>"entries"} DELETE /blogs/:blog_id/entries/:id {:action=>"destroy", :controller=>"entries"} DELETE /blogs/:blog_id/entries/:id.:format {:action=>"destroy", :controller=>"entries"}
こうすることによって、例えばroot/blog/1/entriesにアクセスした場合。
entryコントローラのindexアクションではparams[:blog_id]によって、ブログのidを取得できるようになる。
blog_id=1 かつ entry_id=2のshowへのpathの作成は以下の通り
blog_entry_path(blog_id, entry_id)
ちなみに僕は、indexコントローラでblogを取得し、以下のように書きました
<% for entry in @entries %> <tr> <td><%=h entry.title %></td> <td><%=h entry.content %></td> <td><%= link_to 'Show', blog_entry_path(@blog, entry) %></td> <td><%= link_to 'Edit', edit_blog_entry_path(@blog, entry) %></td> </tr> <% end %>