ネストしたリソース定義

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 %>