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カラムを追加します。(通常のやり方と同様です)
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
ルーティングの設定
ルーティングの設定を、生成したコントローラーを参照するよう設定します。
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カラムを追加します。
# def configure_sign_up_params
# devise_parameter_sanitizer.permit(:sign_up, keys: [:attribute])
# end
有効化してnameカラムを追加↓
def configure_sign_up_params
devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
end
またこれを呼び出すbefore_actionの記述もコメントアウトされた状態で記述されているのでこちらも有効化します
# before_action :configure_sign_up_params, only: [:create]
有効化↓
before_action :configure_sign_up_params, only: [:create]
これでストロングパラメーターの設定ができました。
補足
deviseのメソッドを使う場合は、命名したモデル名を使用することに注意してください。
例
current_user ⇨ current_customer_user
user_signed_in? ⇨ customer_user_signed_in?
最後に
deviseは自動でユーザー管理機能を実装してくれる便利なライブラリですが
裏側を知らないと自分でカスタマイズできない厄介者ですね。
以上です。