35
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

管理ユーザが一人もいなくなってしまわないように、更新・削除の制御をする

Last updated at Posted at 2022-07-12

開発環境

macbook air(M1)
rails 6.0.3
ruby 3.0.1

状況

  • 一般ユーザーと管理ユーザーが存在するrailsアプリケーション
  • gem等使用せず開発する
  • 管理ユーザが一人もいなくなってしまわないように、更新・削除の制御をしたい
  • users tableのカラムはname, email, password_digest, adminの構成
  • adminはboolean型で管理

コード例

データベースに登録されている最後の管理者が自身の管理権限を更新、削除出来ないよう、modelにコールバックを設定する。

model/users.rb
before_update :admin_cannot_update
before_destroy :admin_cannot_delete

private

def admin_cannot_update
  throw :abort if User.exists?(admin: true) && self.saved_change_to_admin == [true, false]
end

def admin_cannot_delete
  throw :abort if User.exists?(admin: true) && self.admin == true
end

コード例解説

コールバック

before_update :メソッド…データが更新される前にメソッドの内容を実行
before_delete :メソッド…データが削除される前にメソッドの内容を実行

メソッド

admin_cannot_update
if User.exists?(admin: true)
…もしusersテーブルのadminカラムにtrue(管理者)で登録されているデータが1つだけで、

&& self.saved_change_to_admin == [true, false]
…かつ変更を加えようとしているレコードのadminカラムがtrueからfalseに変更されようとしている場合(最後の管理者がtrueからfalseに帰られようとしている場合)

saved_change_to_attributeメソッドについてはこちらをご参照ください

throw :abort
処理を無視する

admin_cannot_delete
if User.exists?(admin: true)
…もしusersテーブルのadminカラムにtrue(管理者)で登録されているデータが1つだけで、

&& self.admin == true
…かつ変更を加えようとしているレコードのadminカラムがtrueの場合

throw :abort
処理を無視する

35
17
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?