0
0

More than 3 years have passed since last update.

Deviseで複数のモデルのログイン機能を実装する時のお話

Posted at

Deviseで複数のモデルでログイン機能を作る場合の実装の仕方

今回は皆様おなじみdeviseで複数のモデルでのログイン機能の実装ということですが
わかりにくいので簡単に言うと
「ユーザー側のログイン機能」と「お店側のログイン機能」別々に作りたい、ということです。
今回作成するアプリ内で、お店側は商品を出品したりする機能。ユーザー側は商品を購入したりする機能と
やりたいことをわけたいため、ログインの段階から分けておきたい、ということです。
最初は全くわからなかったのですが意外にすんなりと実装できましたので困っている方はこちらをご覧ください

やることとしては
1, deviseのインストール
2, deviseのコマンドで複数のモデルを作成
3, それぞれのモデルに対応するdeviseのコントローラーを作成、編集
4, ルーティングを編集
5, それぞれのモデルのビューファイルを作成

細かいやることはのちに記述していきます。では一つずつ見ていきましょう

Step1 まずは普通にdeviseをインストール

正直ここに関しては今回割愛させていただきます
gemfileにdeviseを入れてbundle installしてどんどんインストールしていってください

Step2 二種類のモデルを作成

さぁここからが本題です。
お店側とユーザー側、二つのログイン機能を作りたい、ということは
それぞれにモデルやテーブルが必要になる、ということですよね
というわけで

% rails g devise user
% rails g devise store

まずはこの二種類のモデルをrailsのdeviseコマンドで作っていきます
そしてマイグレーションファイルが二種類作られていると思いますので
お好みで編集してmigrateしておいてください

お店用とユーザー用のテーブルができていればOKです

Step3 コントローラーの編集

ここからがほんの少しトリッキーかもしれないですね
deviseのコントローラーって基本見えないし触らないしって放置してましたが
今回からコントローラーも触っていきます

rails g devise:controllers users
rails g devise:controllers stores

この二つをターミナルに打ち込みます。
なぜコントローラーが複数形なのか、というと複数のコントローラーが作られるためです
(登録用のコントローラーとかログイン用のコントローラーなどなど)

そしてマイグレーションファイルでユーザーとお店に新しくカラムを追加しましたよね?
ということは個別にストロングパラメーターを設定しなければなりません

先ほど作ったusersのregistration_controllerを見てみましょう

registrations_controller.rb
# frozen_string_literal: true

# class Users::RegistrationsController < Devise::RegistrationsController
  # before_action :configure_sign_up_params, only: [:create]
  # before_action :configure_account_update_params, only: [:update]

  # GET /resource/sign_up
  # def new
  #   super
  # end

  # POST /resource
  # def create
  #   super
  # end

  # GET /resource/edit
  # def edit
  #   super
  # end
(以下省略)

全てコメントアウトされていてなんのことやらという感じですが
私の推測ではデフォルトの記述ですよ!みたいなものだと思っています
こういう場合はコメントアウトを外すことでカスタマイズしていけるようです。
というわけでusersのregistrations_controller.rbにストロングパラメーターを追加していきます。

今回userにはnicknameというカラムを新たに設定したという体でいきましょう
ということはnicknameをストロングパラメーターで許可すれば良いのです。

まずは同ファイル内の41行目あたりにprotectedというものがあるかと思います
私はよく使うのはprivateメソッドですがこれをまずコメントアウト解除します

registrations_controller.rb
  # protected

  # If you have extra params to permit, append them to the sanitizer.
  # def configure_sign_up_params
    # devise_parameter_sanitizer.permit(:sign_up, keys: [:attribute])
  #end

続いてその下に
configure_sign_up_paramsがありますね。登録用のストロングパラメーターです
これをコメントアウト解除し,許可したいパラメータを記述
以下のようなカタチになっていればOKです

registrations_controller.rb
  protected

  # If you have extra params to permit, append them to the sanitizer.
  def configure_sign_up_params
    devise_parameter_sanitizer.permit(:sign_up, keys: [:attribute, :nickname])
  end

最後に
before_actionで使ってもらえるように
同ファイルのほぼ一番上のほうにbefore_actionに関する記述もあるので
コメントアウトしておきます。これでストロングパラメーターを使ってもらえるはずです

registrations_controller.rb
# frozen_string_literal: true

#class Users::RegistrationsController < Devise::RegistrationsController
  before_action :configure_sign_up_params, only: [:create]
# before_action :configure_account_update_params, only: [:update]

あとはお店用のコントローラーでも同じことをすれば大丈夫です。

Step 4 ルーティングの設定
今のままではコントローラーを編集しただけなので使ってもらうことはできません
ルーティングでいま編集したコントローラー、アクションが呼び出されるように工夫しましょう

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

Step 5 ビューファイルの作成

% rails g devise:views user
% rails g devise:views store

個別のビューファイルを作ってアレンジを加えていけば大丈夫です

以上で実装できたかな、と思います。お疲れ様でした

0
0
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
0
0