こんにちは、Railsエンジニアにょけん(@nyoken_box)です。
Railsでアプリを作っている時、アプリを運営する側(管理者)にしか使えない機能を実装したい場面ってありませんか?
例えば、「不正ユーザーのアカウントを削除する」とか。
悪影響のあるユーザーは削除したいけど、誰でもユーザーの削除ができてしまっては困ります。
こういうときは、全ユーザーに対して管理者権限の有無を設定して、管理者権限があるユーザーしか削除を実行できないようにするのが一般的ですね。
というわけで、その方法を見ていきます。
データベースに、boolean型のカラム「admin」を追加する
まずは、ユーザーに対して管理者権限の有無を設定するために、ユーザー情報のデータベースにadmin
というカラムを追加します。
admin
はboolean型で設定して、管理者権限がある場合はtrue、ない場合はfalseを返す想定ですね。
①boolean型のカラム「admin」をデータベースに追加
$ rails generate migration add_admin_to_users admin:boolean
次にdb:migrateといきたいところですが、その前にマイグレーションファイルに少しだけ追記します。
①で作成したマイグレーションファイル(db/migrate/[timestamp]_add_admin_to_users.rb
)に、以下ピンク色の部分を書き足しましょう。
②マイグレーションファイルに「admin」のデフォルト値を追記
class AddAdminToUsers < ActiveRecord::Migration def change add_column :users, :admin, :boolean, default: false end end
default: false
という引数を渡すことで、デフォルトでは管理者権限がない(false)で指定できます。
③マイグレーション実行
$ bundle exec rake db:migrate
管理者権限を付けたいユーザーの「admin」をtrueにする
デフォルトでfalseを渡しているので、今は全てのユーザーが「admin=false」となっています。
管理者権限を与えたいユーザーに対し、adminの値をtrueに変更していきましょう。
データベースの更新はコンソールで行います。
①コンソールを起動
$ rails console
管理者権限を付けたいユーザーのIDを指定して、findメソッドで情報を取ってきて変更します。
ここでは、「ID=1」のユーザーに管理者権限を設定しますね。
②管理者権限を与える
>> user = User.find(1) >> user.admin = true >> user.save
これで、1番目のユーザーに管理者権限を与えられました。
あとは、「adminの値がtrueである場合のみ、画面に実行ボタンを表示する」みたいなことをviewファイルに書けばOKです。
せっかくなので、その辺のサンプルも書いときましょう。
管理者権限「admin」がtrueの場合のみ、削除リンクを与える
該当するviewファイルに、if文を用いて処理を書きましょう。
<% if current_user.admin? && !(current_user == user) %> | <%= link_to "delete", user, method: :delete, data: { confirm: "You sure?" } %> <% end %
実際の画面で見ると、こんな感じ。(一番下の”test”というユーザーに管理者権限を与えてサインインしています)
if文内の「current_user.admin?」でadminがtrueの場合を指定したため、各ユーザーに対して「delete」というリンクがついています。
また、“test”自身には「delete」のリンクがないことにも注目してください。
adminがtrueの場合を指定するだけでは、”test”にも「delete」リンクが実装されてしまいます。
これを避けるために、「!(current_user == user)」=userが現在のユーザーではない場合という条件を指定していたんですね。
Railsで管理者権限(admin)を設定する方法まとめ
Railsで、一定のユーザーだけが実行できるアクション等を作成したい場合は、管理者権限(admin)を利用しましょう。
手順は以下の通りでした。
- データベースにboolean型でカラム「admin」を追加
- 「admin」のデフォルトをfalseで指定
- 管理者権限を与えたいユーザーの「admin」をtrueに変更
- viewファイルで、「admin」がtrueの場合のみアクションを表示させる
Twitterフォローしてね!!!
有益な無益をつぶやくよ↓↓↓
にょけん
コメント