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

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