【Rails】rails-adminを使って簡単に管理画面を作る
簡単に管理画面をつくりたい
ユーザー情報を一覧で見られる単純な管理画面があればいいので、一番簡単に管理画面ができそうなrails-admin
を使いました。
rails-admin
× sorcery
の参考記事が見つからなかったのでブログに残しておきます。
環境
Rails 6.0.3
ruby 2.7.2
認証はgem 'sorcery'
を使用しています。
User
モデルがあり、role
カラムで管理者と一般ユーザーを分類しています。
実装の流れ
gem 'rails-admin'
のインストール- 認証用
sorcery
の設定 - 認可用
gem 'cancancan'
のインストール
rails-adminのインストール
Gemfileに追記
gem 'rails_admin', '~> 2.0'
Run bundle install
ターミナルで実行
rails g rails_admin:install
名前空間を聞かれるので、
/admin
でよければ、Enter
キーを押すサーバを再起動してから、
/admin
にアクセスする。
これでもう既に形はできている。簡単。
翻訳ファイル
Japanese translation for RailsAdmin · GitHub
これをコピペしてconfig/locales/views/rails_admin_ja.yml
に貼り付け。
認証機能を追加
今はログインしていなくても誰でも管理画面にアクセスできる状態なので、認証機能を追加していきます。
認証はsorcery
を使用しているので、公式のwikiのsorcery設定のページを参考にします。
Sorcery · sferik/rails_admin Wiki · GitHub
(略) RailsAdmin.config do |config| config.authenticate_with do #sorceryのメソッド require_login end config.current_user_method(&:current_user) config.parent_controller = 'ApplicationController' #追記 end (略)
class ApplicationController < ActionController::Base before_action :require_login private def not_authenticated flash[:info] = 'ログインしてください' redirect_to main_app.login_path #main_appのプレフィックスをつける end end
最初、main_app
の意味がわからなかったので、省略していたら、No route matches~
のエラーが出てしまいました。
調べてみると、アプリケーションのルーティングと明記する必要があった。
ルーティングプロキシメソッド呼び出しを省略したアプリケーション側のルーティングヘルパーメソッドを、エンジン内でレンダリングされるテンプレートから呼び出そうとすると、未定義メソッド呼び出しエラーが発生することがあります。
このような問題が発生した場合は、アプリケーション側のルーティングメソッドをエンジンから呼びだすときに、main_app
というプレフィックスを付け忘れていないかどうかを確認してください。
認可機能の追加
管理者以外は、アクセスできないようにします。
gem 'cancancan'
を使います。
rails-admin
の公式がこちらを勧めている&ここ以外で使う予定がないので素直に従います。
gem 'cancancan'
追記してbundle install
rails g cancan:ability
公式に設定方法があるのでそのとおりに実装していきます。Lintは多少修正。 Authorization · sferik/rails_admin Wiki · GitHub
CanCanCan · sferik/rails_admin Wiki · GitHub
class Ability include CanCan::Ability def initialize(user) return unless user && user&.admin? # 管理者じゃなかったらこのメソッドを抜ける can :access, :rails_admin # 管理者画面のアクセス許可 can :manage, :all # 管理権限許可 end end
更に、先程のrails_admin
側の設定ファイルに追記する。
RailsAdmin.config do |config| config.authenticate_with do require_login redirect_to root_path unless current_user.admin? # 追記 end config.current_user_method(&:current_user) ## == CancanCan == config.authorize_with :cancancan # コメントアウトを外す (略) end config.parent_controller = 'ApplicationController' end