開発環境
フレームワーク:Ruby on Rails 6.0.0
データベース: MySQL2 Sequel Proを仕様
この技術が必要となった経緯
食べログのようなレストラン検索アプリケーションを開発中、レストラン情報を登録できる管理者ユーザーと、通常ユーザーを分離したかったため
流れをアウトプットしていきます。
adminカラムを追加
管理者ユーザーか否かを判断するためには、
「管理者ユーザーにしかない値を定義し、その値の有無によって条件分岐を行い、権限があるかないかを判断する」
という流れとなります。
そのため、まずはadminという名前のカラムを作成します。
ターミナルにて
# ターミナル
rails g migration AddAdminToUsers
↑カラム追加用のmigrationファイルが作成されました。
# migrationファイル
class AddAdminToUsers < ActiveRecord::Migration[5.2]
def change
add_column :users, :admin, :boolean, default: false
end
end
↑作成されたマイグレーションファイルにカラムを追加する記述をします。
deviseのusersテーブルに追加したいので:usersを指定
カラムの型は「管理者ユーザーか否か?」真偽値をとりたいのでboolean型を使用
デフォルト値は0にしたいので default:falseとします。
rails db:migrate
↑マイグレートします。するとusersテーブルにadminカラムが追加されます。
管理者ユーザーの登録
seedファイルに記述→rails db:seedでusersテーブルに反映させる
# seeds.rb
User.create!(name: "管理者",
email: "admin@sample.jp",
password: "11111111",
password_confirmation: "11111111",
admin: true)
↑管理者ユーザーの情報を記述します。
admin: trueとすることでadminカラムの真偽値が1となります。
カラム名はご自身が開発しているアプリケーションのusersテーブルの内容に合わせてください。
# ターミナル
rails db:seed
↑usersテーブルにseedファイルの内容を登録します。
データベースを確認し、記述した内容と一致していればOKです。
以上で管理者の登録は完了しました。
管理者用コントローラーの作成
次に、管理者用のアクションを定義するコントローラーを作成します。
# ターミナル
rails g controller admin::shops
↑コントローラーが作成できました。
class Admin::ShopsController < ApplicationController
before_action :admin?
#中略
private
def admin?
redirect_to root_path unless current_user.admin?
end
end
↑ コントローラーに使用するアクションを定義します。privateメソッドで現在のユーザーが管理者でなければ、root_pathにリダイレクトする記述をします。
ルーティングの設定
最後にルーティングの設定を行ます。
# routes.rb
resources :shops
namespace :admin do
resources :shops
end
以上で一般ユーザーと管理者ユーザーのアクション分離ができました。