Rails + Devise で admin ユーザー(管理者)を削除できないようにする

Rails で認証エンジンである Devise を使うと、ユーザーの編集画面(users/edit)に”Cancel my account”というアカウント削除用のサブミットボタンが表示され、これを押すことでサインイン中のユーザーが自分自身のアカウントを削除できます。

スクリーンショット 2014-01-05 11.22.35

スポンサーリンク

— 環境 —
rails-4.0.1
devise-3.2.2

以下のページで、usersテーブル(Userモデル)に、adminカラムを追加して管理者ユーザーを追加できるようにしました。

Devise の User モデルに admin カラムを追加して管理者権限ユーザーを作成する | EasyRamble

そこで、管理者は自分自身のアカウントを削除できないようにしたい。間違って削除して困らないようにするため。

事前に、Devise のコントローラーとビューをカスタマイズするための準備を行っておきます。

Rails で Devise のコントローラーをカスタマイズ | EasyRamble
Rails で Devise のビューを作成してカスタマイズ | EasyRamble

Users::RegistrationsController の destroy メソッドをオーバーライド

app/controllers/users/regstrations_controller.rb

Devise で使われるモデル・リソースのインスタンスは、resource という変数名で参照できます。なので current_user == resource という評価で、現在表示しているユーザーがログイン中のユーザーと同一かどうかを判別できます。current_user は、Devise が用意してくれるヘルパーメソッドで、現在サインインしているユーザーを取得します。

また、Rails は属性の真偽値を返すメソッドを自動的に作成する。admin カラムは、MySQL で boolean 値を返すように作成したので、current_user.admin? で現在サインイン中のユーザーが admin ユーザー(管理者)かどうかを判別できます。

サインイン中のユーザーが管理者ではない場合(else節)は、super を呼んで普通に削除できるようにしました。

管理者ユーザーには”Cancel my account”のサブミットボタンを表示しないようにビューを編集

app/views/registrations/edit.html.erb

これで、管理者ユーザーでサインイン中は、Cancel my account のサブミットボタンが表示されない。

以上で、サインイン中のユーザーが admin ユーザー(管理者)の場合には、アカウントの削除を行えないように変更できました。

スポンサーリンク
パーフェクト Ruby on Rails は、最近読んだ Rails 本の中では一番役に立った本です。Chef や Capistrano など Rails と共によく使用される技術にも触れてあります。Ruby on Rails 4 アプリケーションプログラミングは、入門的な内容で Rails の機能全体を網羅されています。
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!