gemを使わず管理画面を実装

gemを使わずにadminユーザーのみアクセスできる管理画面の実装をしたので、やり方についてメモしておきます!

 

 

①adminネームスペース用のルーティングを定義

adminネームスペース用のルーティングを定義します。

以下のように namespace :admin do ~ end の中にルーティングを定義すると、

'admin/users' のように通常の resources :users で定義されるルーティングの先頭に admin/ がついたルーティングが定義されます。

 

config/routes.rb

Rails.application.routes.draw do
get 'login', to: 'sessions#new'
post 'login', to: 'sessions#create'
delete 'logout', to: 'sessions#destroy'
resources 'users'

namespace :admin do
resources :users
end
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
resources :tasks do
collection do
get 'sort_deadline'
get 'narrow_down_status'
end
end
root 'tasks#index'
end

 

rake routes コマンドで確認してみると、以下のようになっております。

gyazo.com

 

②usersテーブルにadminカラムを追加

usersテーブルにadminカラムをboolean型で追加します

以下のコマンドでマイグレーションファイルを作成します。

$ rails g migration AddAdminToUser admin:boolean

以下のように default: false オプションを追加します。

 

db/migrate/20190211050908_add_admin_to_user.rb

class AddAdminToUser < ActiveRecord::Migration[5.2]
def change
add_column :users, :admin, :boolean, default: false
end
end

以下のコマンドでマイグレーションファイルを実行します。

$ rake db:migrate

 

③adminユーザーを作成

以下のようにコンソールで1人だけadminユーザーに変更してみます。

irb(main):001:0> user = User.find(3)
User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 3], ["LIMIT", 1]]
=> #<User id: 3, name: "ハヤシ", email: "twinklestaryoshino@gmail.com", created_at: "2019-02-10 07:42:29", updated_at: "2019-02-10 07:42:29", password_digest: "$2a$10$YciD2DLz.w8OXXR2gEc/M.42kPzFaNdVpOgJfJbAfby...", admin: false>
irb(main):003:0> user.update_attributes!(password: '11111111', password_confirmation: '11111111', admin: true)
(0.2ms) BEGIN
User Exists (0.4ms) SELECT 1 AS one FROM "users" WHERE "users"."email" = $1 AND "users"."id" != $2 LIMIT $3 [["email", "twinklestaryoshino@gmail.com"], ["id", 3], ["LIMIT", 1]]
User Update (4.2ms) UPDATE "users" SET "updated_at" = $1, "password_digest" = $2, "admin" = $3 WHERE "users"."id" = $4 [["updated_at", "2019-02-11 14:46:45.691498"], ["password_digest", "$2a$10$hjz5qiy3J6DJjsPEPqE/i.1XleUNvAcNJAQl7t2yh298QA9lAOalG"], ["admin", true], ["id", 3]]
(1.1ms) COMMIT
=> true

 

 

④admin/users_controller.rbを作成

以下のコマンドで、admin/users_controller.rbを作成します。

$ rails g controller admin/users

同時に以下のファイルも生成されます。

・app/controllers/admin/users_controller.rb

・app/views/admin/users

・spec/controllers/admin/users_controller_spec.rb

・app/helpers/admin/users_helper.rb

・spec/helpers/admin/users_helper_spec.rb

・app/assets/javascripts/admin/users.coffee

・app/assets/stylesheets/admin/users.scss

 

 

⑤indexアクションを定義

admin/users_controller.rbに、以下のようにindexアクションを定義します。

adminではないユーザーがアクセスしては困るので、before_action で admin ユーザー以外は root にリダイレクトさせるメソッドを定義しておきます。

 

app/controllers/admin/user_controller.rb

class Admin::UsersController < ApplicationController
before_action :admin_user

def index
@users = User.all.order("created_at DESC")
end

private
def admin_user
redirect_to(root_path) unless current_user.admin?
end
end

 

⑥管理画面のビューを作成

ユーザー一覧を表示する管理画面を作成します。

app/views/admin/users/index.html.slim

div.fontsize_midium.margintop_big
| 管理画面:ユーザー一覧

- @users.each do |user|
div.margintop_big.card.fontsize_small.padding_midium
| ID:
= user.id
| :
= user.name
| :
= user.created_at

 


adminユーザーでログインし、admin/users/にアクセスしてみると、きちんと管理画面がみれました!!

gyazo.com