0
1

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 3 years have passed since last update.

【備忘録・Rails】deviseを用いた管理者機能の実装

Posted at

初めに

こんばんは、だいごです。
今回は、自身が作成中のオリジナルアプリに用いたdeviseの管理者機能についてまとめます。
よかったらご覧ください。

実装の手順

初めに、deviseを導入していきます。
この手順に関しては、省略しますが、気になる方はこちらの記事を参考にしてください。

devise導入手順

ここからは、管理者機能を実装していきます。
まずは既存のusersテーブルにデータ型がboolaen型のadminカラムを追加するためにmigrationファイルを作成します。

ターミナル
% rails g migration add_admin_to_users admin:boolean

boolean型:真理値の「真 = true」と「偽 = false」という2値をとるデータ型

続いて作成したマイグレーションファイルを編集していきます。
以下のように記述します。

2022XXXXXXXXXX_add_admin_to_users.rb
class AddAdminToUsers < ActiveRecord::Migration[6.0]
  def change
    add_column :users, :admin, :boolean, default: false
  end
end

この記述でのポイントは、default: falseの部分です。
この記述があることで、ユーザーを追加する際、初期値としてadminカラムにはfalseを追加することができます。

マイグレーションファイルの変更後は、以下のコマンドで変更を反映させます。

ターミナル
% rails db:migrate

続いて、管理者の登録を行います。
この登録に関しては、seed.rbファイルを編集する方法とターミナル操作の方法がありますが、今回はターミナルで操作していきます。

事前に登録したユーザーを管理者に変更していきます。

ターミナル
% rails c

[1] pry(main)> user = User.find(1)  
[2] pry(main)> user.admin = true
[3] pry(main)> user.save

これで、管理者の登録が完了しました。
あとは、ビューにおいて管理者とそうでない場合で条件分岐をしてあげれば実装完了です。

今回は、こんな条件分岐を作成しました。

show.html.erb
<%# 省略 %>

<% if user_signed_in? %>
  <% if current_user == @user || current_user.admin? %>
    <div class='edit-btn'>
      <%= link_to 'Edit', edit_user_path(@user), class: "edit" %>
    </div>
  <% end %>
<% end %>

現在のユーザーがマイページのユーザーである時と管理者の場合のみEditボタンが出るようにしました。

終わりに

今回は初心者の自分でもできる方法で管理者機能を実装しました。
他にもコントローラーを分ける方法やGemもあるようなので、機会があればやってみようと思います。
ご指摘・コメントお待ちしております。
ありがとうございしました。

0
1
0

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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?