RailsAdminを導入して、前回作成した管理者ユーザー(管理者用のdeviseユーザーを作成)でログインした場合のみ表示されるようにします。
Rails6。管理画面をどれにしようか迷いましたが、一旦、一番お手軽なRailsAdminにしてみます。

RailsAdminインストール

Gemfileの最終行(deviseの後)に追加

# Use RailsAdmin
gem 'rails_admin'
gem 'rails_admin-i18n'
$ bundle install
$ rails g rails_admin:install
           ?  Where do you want to mount rails_admin? Press  for [admin] > admin
       route  mount RailsAdmin::Engine => '/admin', as: 'rails_admin'
      create  config/initializers/rails_admin.rb
$ rails s
-> http://localhost:3000/admin

認証追加

前回作成した管理者用のdeviseユーザーでログインした場合のみアクセスできるようにします。

config/initializers/rails_admin.rbの5行目辺りのを変更

  ## == Devise ==
  # config.authenticate_with do
  #   warden.authenticate! scope: :user
  # end
  # config.current_user_method(&:current_user)
↓
  ## == Devise ==
  config.authenticate_with do
    warden.authenticate! scope: :admin_user
  end
  config.current_user_method(&:current_admin_user)

タイムゾーン変更

表示時間がズレてるので、タイムゾーンを日本(東京)に設定します。

config/application.rbの14行目辺り(class Applicationの中)に追加

    config.time_zone = 'Tokyo'

翻訳追加

一部の文字が表示されないので、翻訳を追加します。

config/locales/ja.ymlの最終行に追加

  datetime:
    distance_in_words:
      half_a_minute: "30秒前後"
      less_than_x_seconds:
        one:   "1秒"
        other: "%{count}秒"
      x_seconds:
        one:   "1秒"
        other: "%{count}秒"
      less_than_x_minutes:
        one:   "1分"
        other: "%{count}分"
      x_minutes:
        one:   "約1分"
        other: "%{count}分"
      about_x_hours:
        one:   "約1時間"
        other: "約%{count}時間"
      x_days:
        one:   "1日"
        other: "%{count}日"
      about_x_months:
        one:   "約1ヶ月"
        other: "約%{count}ヶ月"
      x_months:
        one:   "1ヶ月"
        other: "%{count}ヶ月"
      almost_x_years:
        one:   "1年弱"
        other: "%{count}年弱"
      about_x_years:
        one:   "約1年"
        other: "約%{count}年"
      over_x_years:
        one:   "1年以上"
        other: "%{count}年以上"
  date:
    formats:
      default: "%Y/%m/%d"
      short: "%m/%d"
      long: "%Y年%m月%d日(%a)"
    day_names: [日曜日, 月曜日, 火曜日, 水曜日, 木曜日, 金曜日, 土曜日]
    abbr_day_names: [日, 月, 火, 水, 木, 金, 土]
    month_names: [~, 1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月]
    abbr_month_names: [~, 1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月]
    order:
      - :year
      - :month
      - :day
  time:
    formats:
      default: "%Y/%m/%d %H:%M:%S"
      short: "%y/%m/%d %H:%M"
      long: "%Y年%m月%d日(%a) %H時%M分%S秒 %Z"
    am: "午前"
    pm: "午後"

config/locales/devise.ja.ymlの最終行に追加

        admin_user:
          attributes:
            email:
              taken: "は既に使用されています。"
              blank: "が入力されていません。"
              too_short: "は%{count}文字以上に設定してください。"
              too_long: "は%{count}文字以下に設定してください。"
              invalid: "は有効でありません。"
            password:
              blank: "が入力されていません。"
              too_short: "は%{count}文字以上に設定してください。"
              too_long: "は%{count}文字以下に設定してください。"
              invalid: "は有効でありません。"
            password_confirmation:
              confirmation: "が%{attribute}と一致しません。"
            current_password:
              blank: "が入力されていません。"
              invalid: "が違います。"
        admin_user:
          attributes:
            email:
              taken: "既に使用されています。"
              blank: "入力してください。"
              too_short: "%{count}文字以上で入力してください。"
              too_long: "%{count}文字以下で入力してください。"
              invalid: "形式が正しくありません。"
            password:
              blank: "入力してください。"
              too_short: "%{count}文字以上で入力してください。"
              too_long: "%{count}文字以下で入力してください。"
            password_confirmation:
              confirmation: "%{attribute}と一致しません。"
            current_password:
              blank: "入力してください。"
              invalid: "違います。"

config/locales/devise.views.ja.ymlの10行目辺り(ja.activerecord.attributesの中)に追加

      admin_user:
        current_password: "現在のパスワード"
        email: "メールアドレス"
        password: "パスワード"
        password_confirmation: "確認用パスワード"
        remember_me: "ログインを記憶"
        reset_password_sent_at: "パスワードリセット送信時刻"
        remember_created_at: "ログイン記憶時刻"
        created_at: "作成日"
        updated_at: "更新日"

20行目辺り(上記の下)のを変更

    models:
      user: "ユーザ"
↓
    models:
      user: "ユーザー"
      admin_user: "管理者"

※「ユーザ」か「ユーザー」かは好みかもしれないけど

$ rails s
-> http://localhost:3000/admin

テスト追加

requestテストを使って、未ログインだと見れない、ログイン中なら見れる事のテストを追加します。

spec/requests/admin_spec.rbを作成

require 'rails_helper'

RSpec.describe 'Admin', type: :request do
  let!(:admin_user) { create(:admin_user) }

  describe 'GET /admin' do
    context '未ログイン' do
      it 'returns a 302 response' do
        get '/admin'
        expect(response).to have_http_status(302)
      end
    end

    context 'ログイン中' do
      before do
        sign_in admin_user
      end
      it 'returns a 200 response' do
        get '/admin'
        expect(response).to have_http_status(200)
      end
    end
  end
end

spec/rails_helper.rbの71行目辺りに追加

  config.include Devise::Test::IntegrationHelpers, type: :request

spec/factories/admin_users.rbを作成

FactoryBot.define do
  factory :admin_user do
    pass = Faker::Internet.password(min_length: 8)
    email                 { Faker::Internet.email }
    password              { pass }
    password_confirmation { pass }
  end
end
$ rspec
40 examples, 0 failures

【参考】ここまでのコミット内容
https://dev.azure.com/nightonly/rails-app-origin/_git/rails-app-origin/commit/1b5bfc1dbe4608605b264c93ae0b4d7f3c6b6b6e

RailsアプリにサクッとRailsAdminを導入” に対して1件のコメントがあります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です