3
3

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でユーザー登録機能と法人登録機能をそれぞれ分けて実装する

Last updated at Posted at 2020-11-01

プログラミングの学習を始めてはや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初投稿のうえ、マークダウン記法等もまだ詳しく理解していないため、少し読みづらい点があったかもしれません。

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

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?