複数モデルでdeviseを使う

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

deviseの基本的な使い方は以下の記事を参照
[【Rails】deviseが最低限使えるようになるためのポイント - Qiita](https://qiita.com/d0ne1s/items/29bf2b55340d489f3b28)

## deviseをインストール
```rb:Gemfile
gem 'devise'
```
```zsh
$ bundle install
$ rails g devise:install
```
```config/environments/development.rb
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
```
```erb:app/views/layouts/application.html.erb
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>
```
## Modelを作成
```zsh
$ rails g devise User
$ rails g devise AdminUser
$ rails db:migrate
```

## Controllerを作成
```zsh
$ rails g devise:controllers users
$ rails g devise:controllers admin_users
```

## Viewを作成
```config/initializers/devise.rb
config.scoped_views = true
```
```zsh
$ 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
にアクセスして、ログイン画面が表示されることを確認。

## テスト用のページを作成
```zsh
$ 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
```

```erb: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 %>
```
```erb:app/views/user_posts/index.html.erb
<%= link_to 'ログアウト', destroy_user_session_path, method: :delete %>
.
.
.
```
```erb: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_controller`に`before_action`をセットした方が良いかと思います。