DK’s diary

プログラミング初学者による発信

deviseにおいて登録したい項目を追加する方法

deviseの導入

deviseはRailsのgemの一つで簡単にユーザー管理機能を実装できます。
まずGemfileに記述をします。

gem 'devise'


忘れずにbundle installしましょう!
次にdeviseの設定ファイルを生成します。
ターミナルにて以下のコマンド入力します。

rails g devise:install


次にuserモデルの作成を行いますがdeviseを利用する為に、通常のコマンドとは異なります。
ターミナルにて以下のコマンド入力します。

rails g devise user


これにより、マイグレーションファイルの生成やroutes.rbファイルにルーティングの記述が自動的に行われており、新規登録やログインのルーティンが設定されています。


routes.rb

Rails.application.routes.draw do
  devise_for :users         #自動で追記
end

rails routesで設定されているルーティングを確認すると、


f:id:dkdkdk3:20200504212607p:plain



sessionやらregistrationやらとルーティングがしっかり設定されています!
では次に、生成されたマイグレーションファイルに追記を行います。
deviseではemailとpasswordについてあらかじめ設定されています。
今回はnameカラムを追加してみましょう。


マイグレーションファイル

          .
          .
t.string :email,              null: false, default: ""
t.string :encrypted_password, null: false, default: ""
t.string :name      #追記
          .
          . 


忘れずにマイグレートしましょう。


最後に実際に新規登録画面を確認しましょう!
http://localhost:3000/users/sign_upにアクセスします!



f:id:dkdkdk3:20200504214802p:plain


このように最低限ではありますが、自動的にビューも整っています。
いい感じになっていると思いきや、追加したnameの欄がありません。
残念ながらマイグレーションファイルに追記しただけではdeviseの機能には反映されません。



追加の項目を反映させるには(ビュー画面編)

まずビューにnameの登録欄を作成しましょう!
実は、今までの過程でdeviseのビュー画面は生成さてていません。


ターミナル

rails g devise:views


これでapp/views/deviseの各ディレクトリ内にファイルが生成されます。
今回は新規登録画面を編集するので、registrations内のnewファイルに追記します。

  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name, autofocus: true, autocomplete: "name" %>
  </div>


f:id:dkdkdk3:20200504221124p:plain



ビューにも反映されました!
しかしこのままではまだデータベースに登録はされません。
なぜならストロングパラメーターを設定していないからです。


追加の項目を反映させるには(ストロングパラメーター編)

deviseに追加の項目を設定した場合、app/controllers/application_controller.rbを編集します。

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

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


sign_upアクションのnameキーを許可するように記述しました。
これでデータベースにも反映されるようになりました!

因みに、今回は新規登録のみなのでsign_upアクションのみ許可しましたが、登録内容の編集を反映させたいときはaccount_updateアクションについても記述しないと変更内容が保存されないので注意です。