⭐️Adminとは何?
└Railsでアプリを作っている時、アプリを運営する側(管理者)にしか使えない機能を実装したい時に使うもの。
全ユーザーに対して管理者権限の有無を設定して、管理者権限があるユーザーしか削除を実行できないようにするのが一般的なAdmin
⭐️enumとは?
└enumとは、列挙型とも呼ばれ、一連の整数値に対して複数の変数名をつけられる仕組みを指します。
例えばUserモデルに role というカラムが存在したとしましょう。
この role カラムで判定したいのは「承認されているか、非承認か」ということで、値としてinteger型の0と1が保存されるものとします。
ここで、Userモデルに下記のような定義を施したとします。
enum role: {
general: 0, ←一般ユーザー
admin: 1 ←管理者ユーザー
}
これで role カラムを enum として定義することができました。
enum を定義して、具体的にどのようなことが可能になるのでしょうか?
例えば、ユーザーが承認されているかどうかを判定したい場合、
enum 未定義の場合
~~~(実行したい処理) if @user.status == 1
と言った記述を行わねばならず、記述が長い上に、「1」という数字が何を表しているかわからないコードになってしまいます。
一方で、enum が定義されていると、
enum 定義済の場合
~~~(実行したい処理) if @user.permitted?
と言った具合に、コードを読んだ段階でどのような処理を施しているのかの予測が立ちやすく、且つ簡潔なコードで記述することができます。
enumはこの他にも様々なメソッドが用意されていますので、積極的に活用していけるようにしましょう。
導入の流れ:
①:AdminLTEバージョン3 をyarnでインストールする。
インストール場所:https://adminlte.io/docs/3.0/index.html
yarn add admin-lte@^3.0 を押下する。
②:マニフェストファイルの設定
今までは、app/assets/javascripts/application.js や app/assets/stylesheets/application.scss
に全て記述していましたが、 管理者画面は一般ユーザー用と見た目が大きく異るため、別々で管理していきます。
また、以前は、//= require tree.でapplication.js配下の全ファイルを読み込んでいました。
しかし、今回は同じ階層に管理者用のマニフェストファイルをファイルを配置するため、削除する。
app/assets/javascripts/application.js
//= require jquery3
//= require popper
//= require bootstrap-sprockets
//= require rails-ujs
//= require activestorage
#//= require tree.を削除する。(削除しないと、不必要な管理者用ファイルまで読み取ってしまうから)
app/assets//javascripts/admin.js
//= require jquery3
//= require rails-ujs
//= require admin-lte/plugins/bootstrap/js/bootstrap.bundle.min
//= require admin-lte/dist/js/adminlte
app/assets/stylesheets/admin.scss
@import 'admin-lte/plugins/fontawesome-free/css/all.min.css';
@import 'admin-lte/dist/css/adminlte.css';
③:アセット関連の設定
・config/initializers/assets.rbに下記がコメントアウトになっているので外してあげる。
**Rails.application.config.assets.precompile += %w[admin.js admin.css]**
④管理者用機能のコントローラ設定
4-1:管理系コントローラーに共通する機能を持つ基底クラス、Admin::BaseControllerを作成する
rails g controller Admin::Base
**class Admin::BaseController < ApplicationController**
#管理者画面は、一般ユーザーと画面のデザインが違うので一般ユーザーとは違うレイアウトファイルを使用するため、下記のように記載する。
before_action :check_admin
layout 'admin/layouts/application'
private
#ログインしてないときに実行される(sorceryメソッド)
def not_authenticated
flash[:warning] = t('defaults.message.require_login')
redirect_to admin_login_path
end
#管理者権限がないユーザーを排除する
def check_admin
redirect_to root_path, warning: t('defaults.message.not_authorized') unless current_user.admin?
end
end
4-2:他の管理系コントローラーは、Admin::BaseControllerを継承するように作成する
rails g controller admin::Dashboards index
app/controllers/admin/dashboards_controller.rb
class Admin::DashboardsController < **Admin::BaseController ←継承先を「Admin::BaseController」にする。**
def index; end
end
app/controllers/admin/user_sessions_controller.rb
class Admin::UserSessionsController < **Admin::BaseController ←継承先を「Admin::BaseController」にする。**
skip_before_action :require_login, only: %i[new create]
skip_before_action :check_admin, only: %i[new create]
#管理者用のログイン画面のデザインは、一般ユーザー画面の中のデザインと異なるため、レイアウトファイルをオーバーライドする事でレイアウトファイルを変えている。
layout 'layouts/admin_login'
def new; end
#sorceryメソッド。emailとパスワードでログイン認証する。
def create
@user = login(params[:email], params[:password])
if @user
redirect_to admin_root_path, success: t('.success')
else
flash.now[:danger] = t('.fail')
render :new
end
end
def destroy
logout
redirect_to admin_login_path, success: t('.success')
end
end
⑤:Usersテーブルに role というカラムを追加し、そこの値で権限を判定できるようする。