Ruby on Rails

【Ruby on Rails】namespaceを適用してadminを切り分けてdeviseを使って認証

Railsで管理画面生成のgemを使わずに手っ取り早く作るにはnamespaceを適用してadminを切り分けるのがよさそう。
認証にdeviseというgemを使って、ささっと管理画面を作ってみたときのメモです。

実現したい内容

  • モデルのCRUDは認証済みの管理者だけが行う
  • 管理画面で作成したデータを公開する
  • 管理画面生成のgemを使わずにシンプルだがカスタマイズしやすい管理画面を作りたい

実現する方法

  • namespaceを使ってhttp://yourdomain.com/admin/のようなアクセスを実現
  • /admin以下はログイン済みの管理者ユーザのみアクセス化
    • 認証はdeviseというGemを使用
  • Modelはそのまま使う
  • Controller、View、Assets、Helperはadmin専用のファイルで管理する

実際につくってみた

Shopモデルを作成していく
管理者だけがShopモデルをCRUDできて、一般ユーザは一覧や詳細をみれるように

1. deviseの導入

詳しくは、Ruby on Rails – deviseを使ってユーザの認証機能をカンタン実装をご参照下さい。

上記サイトでは、Userモデルを作成していうるのですが、今回は管理機能を作るのでAdminモデルを生成する点に注意

$ rails g devise Admin

2. scaffoldを使ってShopモデルを生成

魔法のコマンドscaffoldを使ってShopのCRUD完成です

$ rails g scaffold shop name:string address:string description:text
$ rails db:migrate

3. ルーティングを修正

config/routes.rbを修正

Rails.application.routes.draw do
  devise_for :admins
  namespace :admin do
    resources :shops
  end
  ・・・
end

4. adminディレクトリを作成

$ mkdir -p app/assets/javascripts/admin
$ mkdir -p app/assets/stylesheets/admin
$ mkdir -p app/assets/images/admin
$ mkdir -p app/controllers/admin
$ mkdir -p app/helpers/admin
$ mkdir -p app/views/admin
$ mkdir -p test/controllers/admin

5. ファイルをコピーして名前やメソッドを変更

$ cp app/controllers/shops_controller.rb app/controllers/admin/
$ cp test/controllers/shops_controller.rb test/controllers/admin/
$ cp app/helpers/shops_helper.rb test/helpers/admin/
$ cp -r app/views/shops app/views/admin/shops
  1. admin配下のControllerやHelperの名前を変更
    • ShopsControllerAdmin::ShopsController
    • ShopsHelperAdmin::ShopsHelper
    • ShopsControllerTestAdmin::ShopsControllerTest
  2. form_forlink_toなどのURLをAdminありにしないといけない

6. deviseでの認証機能を実装

admin配下のcontrollerにbefore_action :authenticate_user!を追加する

-Ruby on Rails