! 親子構造のあるモデルを扱うコントローラをRESTfulにする
親子構造のあるモデルのRESTfulなURLの形は、親の情報の下に子の情報が並びます。例えば、ID=3のプロジェクトに参加しているメンバー一覧の画面は、次のようなURLにするとRESTfulです。
http://localhost:3000/projects/3/members
このような形のI/Fを簡単に定義するには、routes.rb に次のように記述します。
map.resources :projects do |project|
article.resources :members
end
これは、次のように記述するのと同じ意味です。
map.resources :projects
map.resources :members, :path_prefix => '/projects/:project_id', :name_path => 'project_'
ちなみに、この書き方では、:members ルートの :name_prefix (URLヘルパーメソッド名の前につくprefix)は 'project_' となります。このような親に起因する :name_prefix が不要の場合は、:name_prefix => nil を指定します。
map.resources :projects do |project|
article.resources :members, :name_prefix => nil
end
ところで、実際には、子モデルのモデル名やコントローラ名には親の名前を冠している場合が少なくありません。例えば、Project モデルと ProjectMember モデルを用意している場合があります。しかし、URL上で素直に表すと、projects/3/project_members というようにくどくなってしまい、美しくありません。
仮に、URLの members に対して処理をさせたいコントローラが ProjectMembersController なのであれば、次のように :controller オプションつきで map.resourcesを使うとうまくいきます。
map.resources :projects do |project|
project.resources :members, :controller => 'ProjectMember'
end