Railsで管理者機能というと、
namespaceで一般ユーザーと管理者をわけて、管理者側の機能を一から自分で実装する方法や、
rails_admin
、active_admin
、Administrate
といった管理機能の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_admin
とcancancan
2つのgemをインストールします。
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つのコメントアウトを外します。
:
# == 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?
のところを書き換えていきます。
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>
<!--ログインしてるユーザーが管理者の場合のみ-->
<% 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管理者画面の日本語化
最後まで見ていただきありがとうございました。