Kaorina’s diary

Ruby on Railsとかとか

deviseの招待機能を使って、登録時に氏名も登録できるようにする

deviseを使って招待機能(Invitable)を使う際、招待メールの内のリンク先でデフォルトはPasswordのみを登録するのですが、氏名も一緒に登録させたいというお題が出たのでやってみた。
任意の項目を追加する場合は使える場合のお話です。

イメージ

1. rails cで招待したいemailを追加
User.invite!(email: "自分のEmail")
2. 招待メールが送信される(下記はletter openerを利用)

f:id:Kaorina:20160722151055p:plain

3. 「招待を承認する」からリンクした登録画面。

f:id:Kaorina:20160722150921p:plain
ここで入力した内容がuserテーブルのnameカラムへ登録される。

やったこと

1. devise, Invitableを使えるようにする

下記URLを参考に 1〜5. Controllerを作る、 7.routingを設定する まで進める

Railsで、deviseとdevise_invitableをつかって招待機能を実装する - Qiita


2. 氏名用のカラムを追加
rails generate migration AddColumnToUsers name:string

migrationファイルが作成され、問題なければmigration実行。

rake db:migrate
3. :name を許可するためにStrong Parametersを修正

これをしないとnameがスルーされて登録されない。

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.for(:accept_invitation) << :name #招待を承認時用
    devise_parameter_sanitizer.for(:account_update) << :name  #アカウントの更新時用
  end
end


deviseのバージョンが4.0以上の場合はpermitを使った書き方ができるぽい!

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

  protected

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

参考URL: https://github.com/plataformatec/devise#strong-parameters


4. viewを修正

name部分を追加

app/views/devise/invitations/edit.html.erb

<div class="login-area">
  <%= image_tag "logo.png" %>

  <%= form_for resource, :as => resource_name, :url => invitation_path(resource_name), :html => { :method => :put } do |f| %>
    <%= devise_error_messages! %>
    <%= f.hidden_field :invitation_token %>

    <!-- この部分を追加 -->
  <div class="field">
      <%= f.text_field :name, autofocus: true, autocomplete: "off", class: "form-control", placeholder: "氏名(本名)を入力してください" %>
    </div>
   <!-- ここまで -->

    <div class="field">
      <br>
      <%= f.password_field :password, autofocus: true, autocomplete: "off", class: "form-control", placeholder: "NEW PASSWORD" %>
    </div>

    <div class="field">
      <br>
      <%= f.password_field :password_confirmation, autocomplete: "off", class: "form-control", placeholder: "CONFIRM NEW PASSWORD" %>
    </div>

    <div class="actions">
      <br>
      <%= f.submit t("devise.invitations.edit.submit_button"), class: "btn btn-info btn-block" %>
    </div>
  <% end %>
</div>
5.(必要であれば)usersモデルにバリデーションを追加しておく

app/models/user.rb

class User < ActiveRecord::Base

  devise :invitable, :database_authenticatable, :recoverable, :rememberable, :trackable, :validatable

  --- 中略 ---

  validates :name, presence: true, length: { minimum: 2 }
end

これで出来たよ!