概要
コントローラーやビューを生成する時、
それぞれ同じ名前になってしまうコントローラー名やビューの名前がある。
例えば、user
photographer
admin
ぜんぶContacts.controller(お問い合わせ用)を持っています。
そこでディレクトリを指定してコントローラーを生成してあげたら、
adminsディレクトリ下にあるものはadmins/contactsというURLとして呼び出してくれると思ったわけですが・・
ここでルーティング内の重複はどうなるんだ〜となりました。
そこでnamespace(名前空間)という便利なものを知ったのでメモします
Namespace(名前空間)とは
名前の重複があるときに、衝突を防ぐために使用します。
##前提
今回はgem deviseでログイン機能を実装したため、
すでに$rails g devise:controllers admins
コマンドでadmins
ディレクトリがあります。
そこにdevise関連ではないコントローラーも追加していきたい!という感じ。
##とりあえずコントローラーを生成してみよう
rails generate controller admins/Contacts edit update
これだけ
##ルーティングは?
上のコマンドでコントローラーを生成した時点で、
namespace :admins do --- end
という枠組みが作成されて、
namespace枠内に、GETやPOSTなど自分が追加したアクションがきちんとルーティングされています 今回はResourcesに書き換えました。
Rails.application.routes.draw do
namespace :admins do
resources :contacts, only:[:edit, :update]
end
# アドミンのcontacts
resources :contacts, only:[:new, :create]
# ユーザーのcontacts
devise_for :photographers
devise_for :admins
devise_for :users
end
これで名前が一緒でも、
「このcontactsはadminね。」 「このcontactsはuserね。」という感じで
判別してくれるわけです