- 更新日: 2014年1月5日
- Devise
Rails + Devise で admin ユーザー(管理者)を削除できないようにする
Rails で認証エンジンである Devise を使うと、ユーザーの編集画面(users/edit)に”Cancel my account”というアカウント削除用のサブミットボタンが表示され、これを押すことでサインイン中のユーザーが自分自身のアカウントを削除できます。
— 環境 —
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
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class Users::RegistrationsController < Devise::RegistrationsController def destroy if current_user == resource && current_user.admin? flash[:error] == "You can't delete yourself" redirect_to user_path(resource) else super end end # ・・・ end |
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
1 2 3 4 5 |
<% unless current_user == resource && current_user.admin? %> <h3>Cancel my account</h3> <p>Unhappy? <%= button_to "Cancel my account", registration_path(resource_name), :data => { :confirm => "Are you sure?" }, :method => :delete %></p> <% end %> |
これで、管理者ユーザーでサインイン中は、Cancel my account のサブミットボタンが表示されない。
以上で、サインイン中のユーザーが admin ユーザー(管理者)の場合には、アカウントの削除を行えないように変更できました。
- Devise の関連記事
- RailsのDevise認証機能での実装チェックリストまとめ
- Deviseで送信されるメールのfrom(送信者メールアドレス)を変更
- Facebook の OAuth 認証で OAuthException(191)エラー
- Rails Devise でパスワードリセットなどのメールテンプレート(Mailer ビュー)をカスタマイズ
- Rails + Devise 環境でのフレンドリーフォワーディング機能を修正
- Deviseでユーザー登録完了時にウェルカムメールを送信する
- Rails Devise でユーザーがプロフィール情報を更新後に元のページにリダイレクトさせる
- Devise でユーザーがパスワードなしでアカウント情報を変更するのを許可
- Rails Deviseの日本語化辞書ファイル(devise.ja.yml)
- Devise3.2.2 のデフォルト設定では、Rememberable の remember_token のカラムがないのでソースを解読してみた
Leave Your Message!