Rails 超簡単管理者権限

#  はじめに
筆者は [大学生限定 プログラミングコミュニティ 『GeekSalon』](https://geek-salon.com/?utm_source=Direct&utm_medium=attract&utm_campaign=2Q&utm_content=Fukuoka_E_2Q)で活動している者です！ 
もし少しでも興味がありましたら、ぜひお話を聞きにきてくださいね ♪

では本題。全知全能管理者権限をつけたいそこのあなたに向けて
簡単な方法で実装できる管理者権限を記事にしてみましたっ！^^

##前提
devise を使ってユーザー周りを作成していること
簡単な投稿機能をつけているサイトであること

#管理者権限を付与する
まずusersテーブルにユーザーが管理者かどうかを判定するためのカラム(adminカラム)を追加します！
管理者ならtrueをそうでなければfalseを返したいので、データ型はboolean型にします！

```
$ rails g migration: AddAdminToUser admin:boolean
```
ここでマイグレーションファイルがうまく作成されているかを確認しましょう！
管理者権限は基本的に特定の人にしか付与しないので、作成されたマイグレーションファイルに　```default: false``` を追加します。

```ruby:db/〇〇_add_admin_to_user.rb
class AddAdminToUser < ActiveRecord::Migration[6.0]
  def change
    add_column :users, :admin, :boolean, default: false  #default: falseの追加をお忘れなく!!!
  end
end
```

```
$ rails db:migrate
```

管理者権限を持たせたいユーザーの初期レコードをseedファイルで定義する
※このサイトではユーザー名を格納するカラムをnameカラムとしています。schemaで自分のものに適したカラム名を加えてください、！

```ruby:db/seeds.rb
User.create!(name:  "kazuya",
             email: "kazuya@mail.com",
             password:  "ochibi",
             password_confirmation: "ochibi",
             admin: true)
```

```
$ rails db:seed
```

### ※複数の人に管理者権限を付与したい場合のseedファイルの書き方
```ruby:db/seeds.rb
User.create!(
  [
    {
      name:  "kazuya",
      email: "kazuya@mail.com",
      password:  "ochibi",
      password_confirmation: "ochibi",
      admin: true
    },
    {
      name:  "kubochiro",
      email: "kubo@mail.com",
      password:  "dodeka",
      password_confirmation: "dodeka",
      admin: true
    }
  ]
)
```

```
$ rails db:seed
```

### ※管理者のデータを間違えて入れてもた！って人向け
```
$ rails c
```

```
irb(main):001:0> User.all
```
これで消し去りたい管理者のidを確認する
今回管理者権限を剥奪したいkazuyaのidは3でした！！！！！！

```
irb(main):002:0> User.find(3).destroy
```
```
irb(main):003:0> exit
```

#〜管理者権限を使ってやりたいこと色々〜
管理者権限でよく実装されるものを書き連ねます。
こんな権限が欲しいというのが他にありましたらぜひ依頼くださいまし (^_^)

###その１： 不適切な投稿を削除する
どうしてもサイトの趣旨に合わない投稿をされてしまうことってありますよね、、、
これは管理者権限を付与されている人だけが、どんな投稿でも削除できるようにするとことで解決できます！

``` <% if current_user.admin? %>```これが一番のミソです！！ここでadminの値がtrueかどうかを判定しています(つまりログインしているユーザーが管理者かどうか)

```erb:posts/index.html.erb
<% @posts.each do |t| %>
　　#ここから
    <% if user_signed_in? %>
      <% if current_user.id == t.user_id %>
        <%= link_to "編集する", edit_post_path(t.id) %>
        <%= link_to "削除する", post_path(t.id), method: :delete %>
      <% elsif current_user.admin? %>
        <%= link_to "管理者用編集", edit_post_path(t.id) %>
        <%= link_to "管理者用削除", post_path(t.id), method: :delete %>
      <% end %>
    <% end %>
　　#ここまで
<% end %>
```
ざっくり解説すると、、この条件分岐では、ユーザーは自分の投稿の編集削除はできるが、他のユーザーの投稿をいじることはできない。しかし管理者(adminがtrue)だと、全ての投稿を編集削除することが可能。また管理者でログインしているとき、その管理者自身の投稿の編集削除は「編集する」「削除する」と表示されるが、その管理者以外の投稿は「管理者用編集」「管理者用削除」と表示される。
、、、こういう風に条件分岐を駆使して理想状態を考えて作るのは楽しいですよ〜〜 (^O^)

###その２： 不適切管理者だけの秘密のページ❤️
実際にどれくらいの人が自分の作ったサイトに新規登録してくれているのか、気になっちゃいますよね？

ここでは管理者だけが覗けるページ、今回は例として、登録者情報、登録者数をこっそり閲覧するユーザー一覧ページを作成しようと思います！！

他にも良いやり方はあると思いますが、今回は簡単のため条件分岐だけで実装しまふ。。

####usersコントローラー
ユーザーの全情報を取得するために・・・

```ruby:users_controller.rb
class UsersController < ApplicationController
  def index
    @users = User.all
  end
end
```
####一覧ページへのルート
urlは適宜変えてください m(_ _)m
なるべくマイページ(show)を作ってる人がエラー出にくくなるようにこのurlにしました

```ruby:routes.rb
get 'users' =>'users#index' 
```
####一覧ページのビュー
もし管理者権限を付与されていない人がこのページのURLにたどり着いても、中身を表示させないためにif分で制限をかけています。
今回は、登録者情報(メアド、ユーザー名)とアカウントの合計数を表示しています。

```erb:users/index.html.erb
 <% if user_signed_in? %>
   <% if current_user.admin? %>
     <% sum = 0 %>
       <% @users.each do |u| %>
         <p>メアド:<%= u.email %></p>
         <p>名前:<%= u.name %>さん</p>
       <% sum += 1 %>
       <% end %>
     <p>登録者合計：<%= sum %></p>
    <% end %>
  <% end %>
```

####秘密のページに飛ぶための秘密のリンク
秘密のページ(ユーザー一覧ページ)に飛ぶための秘密のリンクを任意のビューページに表示します！
今回は例として posts/index.html.erb に表示させています！

```ruby:posts/index.html.erb
 <% if user_signed_in? %>
   <% if current_user.admin? %>
     <%= link_to "秘密のページへ", users_path %>
   <% end %>
 <% end %>
```
いかがでしたでしょうか、、？？？

これ以外にも管理者権限でやりたいことなどあれば依頼してください🙋‍♂️
その３その４、、を追記していきます、、！！


##忘れないで！
管理者権限を付与する際に、seedファイルに初期レコードを定義しているので、デプロイする際には以下のコマンドを忘れないようにしましょう！！

```
$ heroku run rake db:seed
```
##最後に
ここまで読んでくださってありがとうございました (°▽°)

やっていることは簡単ですが、railsの勉強を始めたばかりの人にとっては、seedファイルをいじったり、コンソールをいじったり、条件分岐を駆使したり、、といい勉強になったのではないかなと思います (￣∇￣)

修正補足依頼、アドバイス等ございましたら、どしどしお願い致しやーーーーーーーーーーーーーーーーーーーーす ！！！

バイチャ〜〜👋