deviseでユーザー名からログインできるようにする


はじめに

deviseはデフォルトでemailとpasswordで新規登録、ログインする仕様になっているため、ユーザー名から登録、ログインできるようにする方法について投稿します。

deviseとは

ユーザーの新規登録、ログイン、ログアウトなど、認証に必要な機能を追加することができるgemです。

deviseの導入方法について

【参照】
https://qiita.com/cocoa-engineer/items/625da569fcac1ad2db1f

Userモデルにusernameカラムを追加する

まず、マイグレーションファイルを作成します。
※Userモデルの作成は、上記「deviseの導入方法について」参照。

$ rails g migration add_username_to_users username:string

作成されたマイグレーションファイルを実行する。

$ rails db:migrate

Strong Parameterの設定

usernameを登録できるように、application_controller.rbにStrong Parameterを設定します。

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: [:username])
   devise_parameter_sanitizer.permit(:sign_in, keys: [:username])
   devise_parameter_sanitizer.permit(:account_update, keys: [:username])
 end
end

登録時にemailを不要にする

登録時にemailを不要にしたい場合、user.rbに以下を追記します。

user.rb
class User < ApplicationRecord
 #usernameを必須・一意とする
 validates :username,uniqueness: true
 devise :database_authenticatable, :registerable,
        :recoverable, :rememberable, :trackable, :validatable

 #登録時にemailを不要にする
 def email_required?
   false
 end

 def email_changed?
   false
 end
end

devise設定ファイルの編集

devise.rbに以下を追記します。

devise.rb
config.authentication_keys = [:username]

Viewの変更

Viewにusernameの項目を追記します。

views/registrations/new.html.erb
<h2>Sign up</h2>
    <%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
     <%= devise_error_messages! %>
         <div><%= f.label :username %><br />
             <%= f.text_field :username %></div>

         <div><%= f.label :password %><br />
             <%= f.password_field :password %></div>

         <div><%= f.label :password_confirmation %><br />
             <%= f.password_field :password_confirmation %></div>

         <div><%= f.submit "Sign up" %></div>
    <% end %>

edit.html.erbについても同様に、usernameの項目を追記したら完了です。

参考サイト