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 コマンドで確認してみると、以下のようになっております。
②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/にアクセスしてみると、きちんと管理画面がみれました!!