LoginSignup
14
17

More than 3 years have passed since last update.

複数モデルでdeviseを使う

Last updated at Posted at 2020-12-24

ユーザーと管理者、それぞれの認証処理をdeviseを使って実装します。
deviseと関係ない説明が増えないように、namespaceは分けずに実装してますが、実際0から開発する場合は分けた方が良いことが多そうです。

deviseの基本的な使い方は以下の記事を参照
【Rails】deviseが最低限使えるようになるためのポイント - Qiita

deviseをインストール

Gemfile
gem 'devise'
$ bundle install
$ rails g devise:install
config/environments/development.rb
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
app/views/layouts/application.html.erb
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>

Modelを作成

$ rails g devise User
$ rails g devise AdminUser
$ rails db:migrate

Controllerを作成

$ rails g devise:controllers users
$ rails g devise:controllers admin_users

Viewを作成

config/initializers/devise.rb
config.scoped_views = true
$ rails g devise:views users
$ rails g devise:views admin_users

routingを作成

config.routes.rb
Rails.application.routes.draw do
  devise_for :users, controllers: {
    sessions: 'users/sessions',
    passwords: 'users/passwords',
    registrations: 'users/registrations'
  }
  devise_for :admin_users, controllers: {
    sessions: 'admin_users/sessions',
    passwords: 'admin_users/passwords',
    registrations: 'admin_users/registrations'
  }
end

この時点で
http://localhost:3000/users/sign_in
http://localhost:3000/admin_users/sign_in
にアクセスして、ログイン画面が表示されることを確認。

テスト用のページを作成

$ rails g controller static_pages index
$ rails g scaffold UserPost title body
$ rails g scaffold AdminUserPost title body
$ rails db:migrate
config/routes.rb
Rails.application.routes.draw do
  root to: 'static_pages#index'
  resources :admin_user_posts
  resources :user_posts
  # 省略
end
app/views/static_pages/index.html.erb
<h2>ユーザー</h2>
<%= link_to 'ログイン', new_user_session_path %>
<%= link_to '新規登録', new_user_registration_path %>
<h2>管理者</h2>
<%= link_to 'ログイン', new_admin_user_session_path %>
<%= link_to '新規登録', new_admin_user_registration_path %>
app/views/user_posts/index.html.erb
<%= link_to 'ログアウト', destroy_user_session_path, method: :delete %>
.
.
.
app/views/admin_user_posts/index.html.erb
<%= link_to 'ログアウト', destroy_admin_user_session_path, method: :delete %>
.
.
.

ログイン後の遷移先を修正

Userとしてログインした後にはuser_posts#index
AdminUserとしてログインした後にはadmin_user_posts#indexに遷移するように設定。

app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  def after_sign_in_path_for(resource)
    case resource
    when User
      user_posts_path
    when AdminUser
      admin_user_posts_path
    end
  end
end

ログインしていないとアクセスできないようにする

Userとしてログインしている時にだけUserPost画面を表示できる
AdminUserとしてログインしている時にだけAdminUserPost画面を表示できる
ように設定。

app/controllers/user_posts_controller.rb
class UserPostsController < ApplicationController
  before_action :authenticate_user!
  #省略
end
app/controllers/admin_user_posts_controller.rb
class AdminUserPostsController < ApplicationController
  before_action :authenticate_admin_user!
  #省略
end

今回はユーザー画面、管理画面共にcontrollerが1つしかないのでこの方法で問題ないですが、実際は複数のcontrollerを作ることになるので、name_spaceを区切ってそれぞれのapplication_controllerbefore_actionをセットした方が良いかと思います。

14
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
17