大場寧子のホームページ - モジュール下のコントローラをRESTfulにする Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

!モジュール下のコントローラをRESTfulにする

モジュールによって階層化されたコントローラをRESTfulにする場合は、map.resources などの記述を、map.namespace ブロックで囲みます。

例えば、Admin::UsersController を RESTfulにするための routes.rb の記述は次のようになります。

  map.namespace(:admin) do |admin|
    admin.resources :users
  end

上記は、ブロック内の map.resources を単独で次のように記述するのと同じ意味です。

admin.resources :users, :path_prefix => :admin, :name_prefix => "admin_", :namespace => "admin/"

namespace ブロック内で記述することで、これらのオプションを、複数のルート記述に対して一括で適用できます。なお、これら3つのオプションの意味は以下のようになります。

* :path_prefix - URLの前につけるパス
* :name_prefix - URLヘルパーメソッド名の前につける文字列
* :namespace - namespace 自体の名前空間。((-2つ以上のモジュール階層を表現するために使われます。通常、自分で指定する必要はありません。-))

!! namespace のネスト

Admin::Accounting::AccountsController のように、モジュール階層が2つ以上の場合は、namespace をネストして使うことができます。

map.namespace :admin do |admin|
   admin.resources :users
   admin.namespace :accounting do |accounting|
     accounting.resources :accounts
   end
end

!! オプションのカスタマイズ

map.namespace のデフォルトのオプション生成を変更したい場合は、2つめの引数でこれらのオプションを指定することができます。

例えば、Admin配下のコントローラのURLを /admin/ ではなく /a/ にしたい場合は、次のように path_prefix を指定しても動作します。

map.namespace :admin, :path_prefix => 'a' do |admin|
   admin.resources :users
end

ただし、ネストしたnamespaceでは、最上位のnamespaceでしかこのような指定は意図したように動作しません。基本的には、namespace のオプションは使わず、resources など、ルート単位のオプションを利用するようにした方がよいでしょう。

map.namespace :admin do |admin|
   admin.resources :users, :path_prefix => 'a'
   admin.namespace :accounting do |accounting|
     accounting.resources :accounts, :path_prefix => 'a/acc'
   end
end