LoginSignup
8
8

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-07-28

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

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

管理者機能の実装方法選択において、この記事がわかりやすかったので、まだどの方法で実装するか悩んでる方は参考にしてみてください。
rails管理画面系gem比較してみた

開発環境

ruby 2.6.3
Rails 5.2.6

前提

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

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

5ステップで解説

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

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

gemのインストール

まずは、rails_admincancancan2つのgemをインストールします。

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の下記設定2つのコメントアウトを外します。

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にしておきます。

マイグレーションファイル
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行目から14行目の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の管理画面へのリンクを作成しておきます。

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

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

まとめ

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

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

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

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

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

rails_admin管理画面の日本語化はこちらの記事で解説しています。
rails_admin管理者画面の日本語化

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

8
8
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
8
8