Programming Journal

学習したことの整理用です。

【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のインストール

公式に沿っていきます。
GitHub - sferik/rails_admin: RailsAdmin is a Rails engine that provides an easy-to-use interface for managing your data

  1. Gemfileに追記 gem 'rails_admin', '~> 2.0'

  2. Run bundle install

  3. ターミナルで実行rails g rails_admin:install

  4. 名前空間を聞かれるので、/adminでよければ、Enterキーを押す

  5. サーバを再起動してから、/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というプレフィックスを付け忘れていないかどうかを確認してください。

Rails エンジン入門 - Railsガイド

認可機能の追加

管理者以外は、アクセスできないようにします。
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

完成

f:id:Study-Diary:20210105211615p:plain
rails-admin