2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Railsのdeviseで2種類のユーザーを作成する方法

Posted at

rails初学者です。
オリジナルアプリ開発にて、deviseを使って2種類のユーザーを作成したかったのですが、方法がわからず他の記事を見ながら調べてきたのでまとめてみました。

この記事の目指すところ

食べログのようなアプリで、
お店を利用する側のユーザー customer_userモデルと
お店を投稿する側のユーザー owner_userモデルの
2種類のモデルを作成する。
またそれぞれにnameカラムを持たせ、ストロングパラメータを設定する。

環境

ruby '2.6.5'
rails '6.0.0'
devise '4.7.3'

※deviseがrailsアプリにインストールされている前提

各モデルの生成

それぞれのモデルを生成していきます。
deviseでuserモデルを生成する方法と全く同じように、ターミナル(コマンドライン)でコマンドを実行していきます。

まずcustomer_userモデルを生成します。

$ rails g devise customer_user

次にowner_userモデルを生成します。

$ rails g devise owner_user

これでcustomer_userモデルとowner_userモデルが生成されました。
またそれぞれのマイグレーションファイルも生成されたので、マイグレーションファイルにnameカラムを追加します。(通常のやり方と同様です)

db/migrate/2021xxxxxxxx_devise_create_cutomer_users.rb
class DeviseCreateCustomerUsers < ActiveRecord::Migration[6.0]
  def change
    create_table :customer_users do |t|
      ## Database authenticatable     
      t.string :name,               null: false  #string型のnameカラムを追加
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""

ownerモデルを生成時のマイグレーションファイルについても同様に記述します。

各コントローラーの作成

1つのユーザーモデルをdeviseで生成する場合は、特にコントローラーをカスタマイズしない限り、コントローラーを手動で生成する必要はありませんが
複数モデルの場合はそれぞれについてコントローラを生成します。

$ rails g devise:controllers customer_users
$ rails g devise:controllers owner_users

このとき、controller's'となることに注意です。

各ビューファイルの作成

ビューファイルについてもターミナルで生成していきます。

$ rails g devise:views customer_users
$ rails g devise:views owner_users

ルーティングの設定

ルーティングの設定を、生成したコントローラーを参照するよう設定します。

config/routes.rb
Rails.application.routes.draw do
  devise_for :customer_users, controllers: {
    sessions: 'customer_users/sessions',
    registrations: 'customer_users/registrations'
  }

  devise_for :owner_users, controllers: {
    sessions: 'owner_users/sessions',
    registrations: 'owner_users/registrations'
  }
end

ストロングパラメーターの設定

1つのユーザーモデルを生成した際にストロングパラメーターを設定する時は
app/controllers/application_controller.rbに

devise_parameter_sanitizer.permit(:sign_up, keys: [:name])

を記述していましたが、今回は生成したcustomer_usesとowner_usersのregstrationコントローラーにそれぞれストロングパラメーターを記述していきます。

上記のコントローラーには、すでにコメントアウトされた状態でストロングパラメーターの記述があります。
ファイルの中に下記のような記述があるので、これを有効化し、nameカラムを追加します。

app/controllers/customer_users/registration_controller
# def configure_sign_up_params
  # devise_parameter_sanitizer.permit(:sign_up, keys: [:attribute])
# end

有効化してnameカラムを追加↓

app/controllers/customer_users/registration_controller
def configure_sign_up_params
  devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
end

またこれを呼び出すbefore_actionの記述もコメントアウトされた状態で記述されているのでこちらも有効化します

app/controllers/customer_users/registration_controller
# before_action :configure_sign_up_params, only: [:create]

有効化↓

app/controllers/customer_users/registration_controller
before_action :configure_sign_up_params, only: [:create]

これでストロングパラメーターの設定ができました。

補足

deviseのメソッドを使う場合は、命名したモデル名を使用することに注意してください。

current_user ⇨ current_customer_user
user_signed_in? ⇨ customer_user_signed_in?

最後に

deviseは自動でユーザー管理機能を実装してくれる便利なライブラリですが
裏側を知らないと自分でカスタマイズできない厄介者ですね。

以上です。

2
1
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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?