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? Pressfor [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を導入” に対して2件のコメントがあります。