rails_admin+cancancanで管理者機能実装を５ステップで解説！

Railsで管理者機能というと、
namespaceで一般ユーザーと管理者をわけて、管理者側の機能を一から自分で実装する方法や、
`rails_admin`、`active_admin`、`Administrate`といった管理機能のgemを使う方法が挙げられると思います。

その中でも今回は、`rails_admin`というgemを使って管理者機能の実装をしていきます。

管理者機能の実装方法選択において、この記事がわかりやすかったので、まだどの方法で実装するか悩んでる方は参考にしてみてください。
[rails管理画面系gem比較してみた](https://qiita.com/baban/items/f751fb05c4d2367878aa)

#開発環境

> ruby 2.6.3
> Rails 5.2.6

#前提

まず前提として、deviseを使ってユーザー認証機能が実装済みであること。

管理者権限を付与する際にユーザーに管理者の判定をするカラムをつけるか、adminなどの管理者用のテーブルを作るかの２つがありますが、今回は前者の`ユーザーに管理者の判定をするカラムを追加`していきます。

#５ステップで解説

rails_adminとcancancanを使った管理者機能実装は`５ステップ`！

- gemのインストール
- rails_adminの設定
- adminカラム追加
- cancancanの設定
- 管理者画面へのリンクの作成

#gemのインストール

まずは、`rails_admin`と`cancancan`２つのgemをインストールします。

```rb:Gemfile
gem 'cancancan'
gem 'rails_admin'
```

Gemfileに追加できたらインストールします。

```
$ bundle
```

#rails_adminの設定

では、rails_adminのセットアップを行っていきます。

ターミナルで下記コマンド実行

```
$ rails g rails_admin:install
```

`Where do you want to mount rails_admin? Press <enter> for [admin]`と聞かれます。
管理者画面のパスはどうする？という意味で、今回はデフォルトの`/admin`でOKなので、Enterを押します。

すると、管理者画面へのルーティングとrails_adminの設定ファイルが作られます。

では作られたrails_adminの設定をいじっていきます。
`config/initializers/rails_admin.rb`の下記設定２つのコメントアウトを外します。

```config/initializers/rails_admin.rb
:
 # == Devise ==
 config.authenticate_with do
   warden.authenticate! scope: :user
 end
 config.current_user_method(&:current_user)

 # == CancanCan ==
 config.authorize_with :cancancan
:
```

これでrails_adminでのdeviseとcancancanの設定は完了です。

#userモデルにadminカラム追加

次に、どのユーザーが管理者なのかを判定するために、userテーブルにadminカラムを追加していきます。

adminカラムはboolean型でデフォルトの値はfalseで、trueのときに管理者として扱います。

ターミナルでadminカラムを追加。

```
$ rails g migration AddAdminToUser admin:boolean
```

マイグレーションファイルが作成されるので、デフォルトをfalseにしておきます。

```rb:マイグレーションファイル
class AddAdminToUser < ActiveRecord::Migration[5.2]
  def change
    # default: falseを追加
    add_column :users, :admin, :boolean, default: false
  end
end
```

マイグレーションファイルへの追加ができたら、反映させます。

```
$ rails db:migrate
```

これで、もともとあったuserテーブルにadminカラムを追加できました。

管理者権限をつけたいユーザーのadminカラムをtrueにしていきます。

```
$ rails c
> user = User.find(1)
> user.update_attribute(:admin, true)
```

他にもseedファイルで管理者用のデータを用意する方法もあります。

#cancancanの設定

そもそもcancancanとは、ユーザーに権限を与えるものです。
管理者であれば全ての機能を使えて、ユーザーは投稿、編集しかできないのようなものです。

では、cancancanのセットアップを行っていきます。

```
$ rails g cancan:ability
```

コマンドを実行すると、権限を管理するファイルが作られます。

`app/models/ability.rb`で、管理者の権限設定をしていきます。

10行目から１４行目の`if user.admin?`のところを書き換えていきます。

```app/models/ability.rb
def initialize(user)
:
  # ログインしているかつadminカラムがtrueの場合
  if user && user.admin?
    # rails_adminへのアクセスを許可
    can :access, :rails_admin
    # 全ての機能を使えるように設定
    can :manage, :all
  end
:
end
```

ログインしていて、adminカラムがtrueのユーザーは、rails_adminへのアクセス権限があり、全てのモデルのCRUDが行える状態になってます。

#管理者画面へのリンクの作成

これで、管理者はrails_adminの管理画面にアクセスできて、管理機能も使える状態になっています。

localhost:3000/admin
など
root pathの後に`/admin`をつけると管理画面に遷移できます。

ただ、毎回URLにベタ打ちするのがめんどくさいので、フッターにrails_adminの管理画面へのリンクを作成しておきます。

```erb:_footer.html.erb
<footer>
  <!--ログインしてるユーザーが管理者の場合のみ-->
  <% if current_user.try(:admin?) %>
    <%= link_to '管理者ログイン', rails_admin_path %>
  <% end %>
</footer>
```

これで、このリンクを踏むだけで、管理画面へ遷移できるようになりました。

#まとめ

rails_adminとcancancanを使った管理者機能実装は`５ステップ`！

>- gemのインストール
- rails_adminの設定
- adminカラム追加
- cancancanの設定
>- 管理者画面へのリンクの作成

今回は、管理機能をrails_adminを使って実装しました。

gemを使うことで、時間が短縮できて他の機能へ注力できるので、開発期間が限られる場合や管理機能にそこまでのカスタマイズ性を求めない場合は、抜群の威力を発揮しますので、ぜひ導入してみてください。

また今回は、rails_adminの管理画面の日本語化までは解説していないので、~~また後日別記事あげさせて頂きます。~~

rails_admin管理画面の日本語化はこちらの記事で解説しています。
[rails_admin管理者画面の日本語化](https://qiita.com/nakachan1994/items/9ffab6fda111dd1d9164)

最後まで見ていただきありがとうございました。