userとadmin画面の作成手順について

こんにちは、たにーです。

チーム開発で管理者画面を簡単に作成できるgemを使わず、
deviseでuserとadminの2つを作成しました。

私は、担当エリアではなかったので
自分でも使えるようにしようと思い、手順を記述していきたいと思います。

基本的に参考文献に掲載したQiitaでできます。(笑)

#目次
- railsアプリ作成
- gemの導入
- modelの作成
- controllerの作成
- routes設定
- viewの作成

#railsアプリケーションを作成

```rb:terminal
 $rails new qiita
```
#gem’devise’の導入

追加します。

```rb:Gemfile
 gem 'deivse'
```

インストールします。

```terminal:terminal
 $bundle install
```

これが出たら完了です。

```rb:terminal
Bundle complete! 19 Gemfile dependencies, 84 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
```

##deviseをインストール

```rb:terminal
 $rails g devise:install
```

そうすると、多くのファイルが作成されます。

##configファイルの修正

次に、devise/rbファイルを変更します。
このような記述があるかと思います。

```rb:/config/initializers/devise.rb
 # ==> Scopes configuration
 # Turn scoped views on. Before rendering "sessions/new", it will first check for
 # "users/sessions/new". It's turned off by default because it's slower if you
 # are using only default views.
 # config.scoped_views = false
```
最後の行を修正します。
コメントアウト　＋　trueに変更してください。

```rb:/config/initializers/devise.rb
 config.scoped_views = true
```

#deviseモデルの作成

userとadminのモデルを作成します。

```rb:terminal(user)
$rails g devise user
      Running via Spring preloader in process 7829
      invoke  active_record
      create    db/migrate/20210326064625_devise_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/models/user_test.rb
      create      test/fixtures/users.yml
      insert    app/models/user.rb
       route  devise_for :users
```
adminでも同じように実行します。

```rb:terminal(admin)
$rails g devise admin
```

#deviseコントローラーの作成

userとadminのコントローラーを作成します。

```rb:terminal(user)
$rails g devise:controllers users

Running via Spring preloader in process 8205
      create  app/controllers/users/confirmations_controller.rb
      create  app/controllers/users/passwords_controller.rb
      create  app/controllers/users/registrations_controller.rb
      create  app/controllers/users/sessions_controller.rb
      create  app/controllers/users/unlocks_controller.rb
      create  app/controllers/users/omniauth_callbacks_controller.rb
===============================================================================

Some setup you must do manually if you haven't yet:

  Ensure you have overridden routes for generated controllers in your routes.rb.
  For example:

    Rails.application.routes.draw do
      devise_for :users, controllers: {
        sessions: 'users/sessions'
      }
    end

===============================================================================
```

adminでも同じように実行します。

```rb:terminal
$rails g devise:controllers admins
```

#routeの設定

次にローティングを設定します。
今の状態を確認してみると、

```rb:config/routes.rb

devise_for :users
devise_for :admins
```

実際にこれがどうなのかを確認するために、ルーティングを見てる。

```title:terminal

$rails routes

                   Prefix Verb   URI Pattern                       Controller#Action
                                #[--- 中略 ---]#
cancel_admin_registration GET    /admins/cancel(.:format)          devise/registrations#cancel
       admin_registration POST   /admins(.:format)                 devise/registrations#create
   new_admin_registration GET    /admins/sign_up(.:format)         devise/registrations#new
  edit_admin_registration GET    /admins/edit(.:format)            devise/registrations#edit
                                #[--- 中略 ---]#
 cancel_user_registration GET    /users/cancel(.:format)           devise/registrations#cancel
        user_registration POST   /users(.:format)                  devise/registrations#create
    new_user_registration GET    /users/sign_up(.:format)          devise/registrations#new
   edit_user_registration GET    /users/edit(.:format)             devise/registrations#edit

                                #[--- 中略 ---]#
```

URLはしっかり、adminとuserで分けれているのが確認できます。
ただ、右側のコントローラーをみると全て、devise/.....の形になっています。

先ほど、**$rails g devise:controllers users**した際に
最後に記載のあった文面を記載する必要があります。

```rb:terminal
    Rails.application.routes.draw do
      devise_for :users, controllers: {
        sessions: 'users/sessions'
      }
    end
```
これを参考にし、routes.rbで書き足します。

```rb:config/routes.rb

  devise_for :admins, controllers: {
  sessions:      'admins/sessions',
  passwords:     'admins/passwords',
  registrations: 'admins/registrations'
  }

  devise_for :users, controllers: {
  sessions:      'users/sessions',
  passwords:     'users/passwords',
  registrations: 'users/registrations'
 }
```

admin,userのそれぞれに
どのコントローラーを使うのかを指定してあげます。

再度ルーティングを見てみると、、、、

```title:terminal
$rails routes

                   Prefix Verb   URI Pattern                       Controller#Action
                                #[--- 中略 ---]#
cancel_admin_registration GET    /admins/cancel(.:format)          admins/registrations#cancel
       admin_registration POST   /admins(.:format)                 admins/registrations#create
   new_admin_registration GET    /admins/sign_up(.:format)         admins/registrations#new
   edit_admin_registration GET   /admins/edit(.:format)            admins/registrations#edit           
                                #[--- 中略 ---]#
 cancel_user_registration GET    /users/cancel(.:format)           devise/registrations#cancel
        user_registration POST   /users(.:format)                  devise/registrations#create
    new_user_registration GET    /users/sign_up(.:format)          devise/registrations#new
   edit_user_registration GET    /users/edit(.:format)             devise/registrations#edit
                                #[--- 中略 ---]#
```

コントローラーが無事、adminsとusersで分けられています。

#viewsの作成

モデル作成時と同様です。

```rb:terminal(user)
$rails g devise:views users
      Running via Spring preloader in process 12348
      invoke  Devise::Generators::SharedViewsGenerator
      create    app/views/users/shared
      create    app/views/users/shared/_error_messages.html.erb
                         #[--- 中略 ---]#
```
adminでも同様に実行します。

```rb:terminal(admin)
$rails g devise:views admins
```

これで、admin側でもuser側でもviewの編集が可能になりました。


# 追記

2021年3月27日投稿

https://qiita.com/tani__san929/items/3ee971b1fb964616d3b4


#参考文献

https://qiita.com/Yama-to/items/54ab4ce08e126ef7dade