親子構造のあるモデルを扱うコントローラをRESTfulにする

親子構造のあるモデルを扱うコントローラを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
Last modified:2020/06/12 18:49:05
Keyword(s):
References:[コントローラのRESTfulインターフェースをカスタマイズする] [Ruby on Rails]