Railsのdeviseでユーザー登録機能と法人登録機能をそれぞれ分けて実装する


プログラミングの学習を始めてはや1ヶ月半の人間です。

個人開発でBtoCのマッチングアプリを作ろうと思い、とりあえずまずはBとCの登録をしなければいけないことに気付き、初心者ながら色々調べつつポチポチと実装しましたので、アウトプットとして記事を残したいと思います。

ここではuserとcompanyでそれぞれの別個の管理テーブルをそれぞれ生成し実装します。

1.deviseの導入

まずはGemfileにdeviseを記し bundle install します。

そしてそのままターミナルでdeviseをインストールします。

% rails g devise:install

2. /config/initializers/devise.rb に手を加える

色々なコードがありますがその中の恐らく247行目?(自分は247行目でした)辺りのコメウントアウトされている、
config.scoped_views = false となっている記述を変更します。コメントアウトも下記のように外します。

/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 = true

3. devise関連のmodelを生成

今回はuserとcompanyのmodelを生成します。

% rails g devise user
% rails g devise company

4. 生成した各modelに関連するcontrollerを生成

% rails g devise:controllers users
% rails g devise:controllers companies

5. 関連するviewを生成

% rails g devise:views users
% rails g devise:views companies

6. routingの設定

これで無事にuserとcompanyの二つをdeviseによる管理ができるようになりました。
次にルーティングを追記します。

/config/routes.rb
  devise_for :companies, controllers: {
    sessions:      'companies/sessions',
    passwords:     'companies/passwords',
    registrations: 'companies/registrations'
  }
  devise_for :users, controllers: {
    sessions:      'users/sessions',
    passwords:     'users/passwords',
    registrations: 'users/registrations'
  }

これでOKです。

7. 使わないviewの削除

これまでの手順の過程でもう使わないビューファイルが生成されてしまっているため削除します。

% rails d devise:views

以上で実装自体は完了しましたが、新規登録時のストロングパラメータ等の記述についてよくわからなかったため、自分流で調べ成功した例を元に説明します。

8. ストロングパラメータを設定する

今までdeviseのモデルが1つの時は追加したカラムがある場合、 application_controller.rb に以下のように設定していました。

/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  private
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
  end
end

しかし今回は二つのモデルがあるため、設定の仕方が分からず、appliction_controllerではなくdeviseで生成した各モデルに関連するそれぞれのcontrollerで設定することにしました。

基本的には該当箇所のコメントアウトを外して許可するキーの配列に任意のカラムを追加していくだけで良いかと思います。

/controllers/users/registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
  before_action :configure_sign_up_params, only: [:create]

  def configure_sign_up_params
    devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname, :email, :password, :phone_number, :detail])
  end
end
/controllers/companies/registrations_controller.rb
class Companies::RegistrationsController < Devise::RegistrationsController
  before_action :configure_sign_up_params, only: [:create]

  def configure_sign_up_params
    devise_parameter_sanitizer.permit(:sign_up, keys: [:company_name, :email, :password, :phone_number, :office_url])
  end
end

以上で完了です。これであとはそれぞれのビューファイルで値を登録すれば無事にデータも保存され、ログイン、ログアウト等の機能も実装できるようになりました。

フォームのviewはuserとcompany二つ用意しなければならないことに注意してください。まあそこは部分テンプレートでどうにでもなりますね。

最後に

読んでいただいた方、ありがとうございました。
Qiita初投稿のうえ、マークダウン記法等もまだ詳しく理解していないため、少し読みづらい点があったかもしれません。

指摘コメント等ありましたら、よろしくお願いいたします。
次回以降の改善に活用させていただきます。