Rails|devise で 新規登録時に 任意のカラムを追加する方法

2023/08/18に公開

開発環境

ruby 3.1.2p20
Rails 6.1.7.4
Cloud9

はじめに

Railsでアプリケーションを作成する際、アカウント登録機能としてdeviseを利用することが多々あります。しかし、deviseのデフォルト状態では、ユーザー情報として emailとpasswordしか登録できません。本記事では、任意のカラムを追加する方法を紹介します。

1. deviseのインストール

Gemfile末尾に以下のコードを追加する。

gem 'devise'

次にターミナルで以下のコマンドを実行する。

bundle install
$ rails g devise:install

2. Userモデルの作成

ターミナルで以下のコマンドを実行する

$ rails g devise User

3. Userモデルに任意のカラムを追加

カラムを追加するためのマイグレーションファイルを作成する。

$ rails g migration add_columns_to_users

マイグレーションファイルに任意のカラム情報を追記する。

add_column :テーブル名, :カラム名,  :データ型

忘れずにdb:migrateを実行する。

$ rails db:migrate

4. 任意のカラムを登録できるように設定

コントローラファイルに下記のコードを追記する。

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

protected

  def configure_permitted_parameters
    added_attrs = [ :email, :password, :password_confirmation, :任意のカラム名 ]
    devise_parameter_sanitizer.permit :sign_up, keys: added_attrs
    devise_parameter_sanitizer.permit :account_update, keys: added_attrs
    devise_parameter_sanitizer.permit :sign_in, keys: added_attrs
  end
  
end
【解説】

before_action :configure_permitted_parameters, if: :devise_controller?
deviseで情報登録をするとき、configure_permitted_parameters が適用される。


added_attrs に、新規登録/ログインする時に使用したいカラムをまとめる。


devise_parameter_sanitizer.permit(:deviseの処理名, keys: [:許可するキー])
この形で各処理で許可したいカラム名(キー名)を記述する。

次に、deviseの設定ファイルに以下コードを追記する。(私の場合は元々falseで記述があり、コメントアウトされていたので、コメントアウトを外し、trueに書き換えました。)

config/initializers/devise.rb
config.scoped_views = true

これで設定は完了です。

5. ビューの設定

ビューを書き換え、任意のカラムを登録できるようにします。


<h2>新規登録</h2>

<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
  <%= devise_error_messages! %>

  <div class="field">
    <%= f.label :メールアドレス %><br />
    <%= f.email_field :email, autofocus: true, autocomplete: "email", class: "form-control" %>
  </div>

  <div class="field">
    <%= f.label :任意のラベル %><br />
    <%= f.text_field :任意のカラム, class: "form-control" %>
  </div>

  <div class="field">
    <%= f.label :パスワード %>
    <% if @minimum_password_length %>
    <em>(<%= @minimum_password_length %>文字以上)</em>
    <% end %><br />
    <%= f.password_field :password, autocomplete: "off", class: "form-control" %>
  </div>

  <div class="field">
    <%= f.label :パスワード再入力 %><br />
    <%= f.password_field :password_confirmation, autocomplete: "off", class: "form-control" %>
  </div>

  <div class="actions">
    <%= f.submit "登録", class: "btn btn-primary btn-block" %>
  </div>
<% end %>

<%= render "devise/shared/links" %>

これで完了です!

参考にさせていただいた記事

https://qiita.com/hz1_d/items/77e440b09a1ddbe56263
https://qiita.com/kaito121855/items/e1a80da8557258c497dc

Discussion