今回は、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>
これで、このリンクを踏むだけで、管理画面へ遷移できるようになりました。