Railsで管理者機能を実装する

今回は、gemの「rails_admin」と「cancancan」を使用して、管理者機能の実装していきます。

前提

まず前提として、deviseを使ってユーザー認証機能を実装しておいてください。

管理者権限を付与する際にユーザーに管理者の判定をするカラムをつける方法で実装していきます。

gemのインストール

まずは、rails_adminとcancancanをインストールします。

Gemfile

gem 'cancancan'
gem 'rails_admin'

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

$ bundle install

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

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

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

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

cancancanの設定

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

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

$ rails g cancan:ability

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

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

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の管理画面にアクセスできて、管理機能も使える状態になっています。

root pathの後に/adminをつけると管理画面に遷移できます。

rails_adminの管理画面へのリンクを作成しておきます。今回はフッターに作成しました。

_footer.html.erb

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

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