Railsアプリにサクッとdeviseを導入のユーザー作成と似てますが、管理者はアカウント登録できないようにするので、初期の管理ユーザーをseedで作れたり、RSpecでアカウント登録できない事をテストできるようにしたいと思います。
Rails6。色々、変わってるのでメモしておきます。

余談:コロナ影響で所属会社でもリモートワークが推奨され、ここ1ヶ月通勤時間が短縮できて良いのですが、結局ダラダラしちゃって良くないという事で、GWから主に朝の時間にRailsの復習を兼ね元々やりたかったアプリ開発をスタートさせました。
今は習慣化出来てるので良いのですが、リモートワークが緩和されたら、どう継続して行くかが課題ですね。

管理者用のdeviseユーザー作成

この辺はuserをadmin_userにしただけで、他は変わりません。

$ rails g devise admin_user
$ rails g devise:views admin_users
$ rails g devise:controllers admin_users

config/routes.rbの2行目辺りのを変更

  devise_for :admin_users
↓
  devise_for :admin_users, controllers: {
    sessions: 'admin_users/sessions'
  }
$ rails db:migrate

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

管理者のアカウント登録禁止

app/models/admin_user.rbの4行目辺りのを変更

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
↓
  devise :database_authenticatable,
         :recoverable, :rememberable, :validatable

deviceのroutingテスト追加

spec/routing/admin_users/registrations_routing_spec.rbを作成
但し、ルートがないことの確認(.to_not be_routable)

require 'rails_helper'

RSpec.describe AdminUsers::RegistrationsController, type: :routing do
  describe 'routing' do
    it 'routes to #new' do
      expect(get: '/admin_users/sign_up').to_not be_routable
    end
    it 'routes to #create' do
      expect(post: '/admin_users').to_not be_routable
    end
    it 'routes to #edit' do
      expect(get: '/admin_users/edit').to_not be_routable
    end
    it 'routes to #update' do
      expect(put: '/admin_users').to_not be_routable
    end
    it 'routes to #destroy' do
      expect(delete: '/admin_users').to_not be_routable
    end
    it 'routes to #cancel' do
      expect(get: '/admin_users/cancel').to_not be_routable
    end
  end
end

spec/routing/users/sessions_routing_spec.rbを作成

require 'rails_helper'

RSpec.describe AdminUsers::SessionsController, type: :routing do
  describe 'routing' do
    it 'routes to #new' do
      expect(get: '/admin_users/sign_in').to route_to('admin_users/sessions#new')
    end
    it 'routes to #create' do
      expect(post: '/admin_users/sign_in').to route_to('admin_users/sessions#create')
    end
    it 'routes to #destroy' do
      expect(delete: '/admin_users/sign_out').to route_to('admin_users/sessions#destroy')
    end
  end
end

spec/routing/users/passwords_routing_spec.rbを作成

require 'rails_helper'

RSpec.describe AdminUsers::PasswordsController, type: :routing do
  describe 'routing' do
    it 'routes to #new' do
      expect(get: '/admin_users/password/new').to route_to('devise/passwords#new')
    end
    it 'routes to #new' do
      expect(post: '/admin_users/password').to route_to('devise/passwords#create')
    end
    it 'routes to #edit' do
      expect(get: '/admin_users/password/edit').to route_to('devise/passwords#edit')
    end
    it 'routes to #update' do
      expect(put: '/admin_users/password').to route_to('devise/passwords#update')
    end
  end
end
$ rspec
38 examples, 0 failures

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

初期の管理ユーザーをseedで作成

初期データは追加される場合もあるので、idも明示して、既に存在する場合はSkipするようにします。

db/seeds.rbの最後に追加

Dir.glob("#{Rails.root}/db/seed/*.yml").each do |filename|
  puts 'filename: ' + filename

  target_model = File.basename(filename, '.yml').classify.constantize
  puts 'model: ' + target_model.to_s

  File.open(filename) do |file_contents|
    yaml_contents = YAML.safe_load(file_contents)
    yaml_contents.each do |yaml_record|
      id = yaml_record['id']

      if target_model.find_by(id: id)
        puts 'id: ' + id.to_s + ' ... Skip create'
        next
      end

      puts 'id: ' + id.to_s + ' ... Create'
      target_model.create(yaml_record)
    end
  end
end

db/seed/admin_users.ymlを作成

- id: 1
  email: admin@mydomain
  password: changepassword
$ rake db:seed
filename: db/seed/admin_users.yml
model: AdminUser
id: 1 ... Create

ログインしてみる。

$ rails s
-> http://localhost:3000/admin_users/sign_in

コミットしないけど、
app/views/layouts/application.html.erbの25行目辺りに追加すると動作確認しやすい。

    <ul>
<% if admin_user_signed_in? %>
      <li><%= current_admin_user.email %></li>
      <li><%= link_to t('log_out'), destroy_admin_user_session_path, method: :delete %></li>
<% else %>
      <li><%= link_to t('log_in'), new_admin_user_session_path %></li>
<% end %>
    </ul>
    <hr/>

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

管理者用のdeviseユーザーを作成” に対して1件のコメントがあります。

コメントを残す

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