はじめに
タイトルの通り、namespaceを使って管理者(admin)と利用者(user)でコントローラーとビューをわけたいと思います。
利用者に公開する画面と管理者に公開する画面は別々で、管理者だけがアクセスできる処理を作成するなどよくあることだと思います。
なのでこのような記事は調べれば沢山でてきますが、勉強のためアウトプットを兼ねて投稿したいと思います。
説明を省略する箇所が多いかもしれませんので、深く理解したいかたは他の記事をみることをおすすめします。
namespaceとは
namespaceは名前空間とも呼ばれており、簡単に言うとコントローラーやモデル、ビュー、ルーティングなどをグループ化するために使用される仕組み。
namespaceの使い方
商品一覧を表示するurl/items
があるとします。
ルーティング
Rails.application.routes.draw do
resources :items
end
通常だとこのようなルーティングを設定することが多いと思いますが、この状態だと管理者(admin)と利用者(user)が同じコントローラーやviewを使用することになります。
今回、管理者と利用者でコントローラーなどをわけたいのでnamespaceを使ってルーテイングをわけたいと思います。
Rails.application.routes.draw do
## 利用者
namespace :user do
resources :items
end
## 管理者
namespace :admin do
resources :items
end
end
これでnamespaceによるルーテイングのグループ化が完成です。
urlは以下のような感じになります。
user_items GET /user/items(.:format) user/items#index
admin_items GET /admin/items(.:format) admin/items#index
/items
の前にそれぞれ admin/
やuser/
がつくようになります。
adminとuserだけであればuserもグループ化する必要はないかもしれません。
controllerとviewの作成
namespaceを使用する場合は、コントローラーやビューはurlと同じディレクトリ構成にする必要があります。
adminを例にすると、urlは
admin/items#index
のようになっているので、adminディレクトリの下にitemsコントローラーを作成する必要があります。
そこで以下のようにディレクトリを指定してコントローラーを作成すると、adminディレクトリの下にコントローラーやviewなど作成してくれます。
$ rails g controller admin/items
同様にuserもコントローラーを作成して、これで管理者(admin)と利用者(user)によってcontrollerとviewをわけて処理を変えることができます。
注意点としてnamespaceを利用するとform_withやlink_toなどを使用する時は、namespaceを考慮する必要があります。説明は省略しますが調べると記事はたくさん出てくると思います。
参考させていただいた記事
https://zenn.dev/sudoukky/articles/731c87c9da80a5
https://ac-creative-lab.net/rails-divide-admin-and-public-using-namespace-and-module/
https://qiita.com/mmaumtjgj/items/77bef3b8ef0ee9a3cbee
https://qiita.com/haruki25596/items/3dec9ec57e4d34742022