【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
完成
