Ruby
Rails

Rails4.1でdeviseのログインIDをemailとusernameのどちらでも可能にする

More than 5 years have passed since last update.


概要

Ruby On Rails4.1環境でdeviseを利用してログイン機能を実装していますが、

そのログインIDをemailでもusernameでも可能にします。


参考

公式のHowToほぼそのままです。

https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-sign-in-using-their-username-or-email-address


テーブルにusernameカラムを追加する

※users以外の名前を付けている場合は適時置き換えて下さい。

usernameカラムを追加

$ rails generate migration add_username_to_users username:string:uniq

生成されたマイグレーションを実行

$ rake db:migrate

必須パラメータ設定の書き換え


app/controllers/application_controller.rb

# 以下を追加

before_filter :configure_permitted_parameters, if: :devise_controller?

protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:username, :email, :password, :password_confirmation, :remember_me) }
devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:login, :username, :email, :password, :remember_me) }
devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:username, :email, :password, :password_confirmation, :current_password) }
end



ログイン用のパラメータlogin(=emailまたはusername)をモデルに設定する

loginパラメータのアクセサを設定


app/models/user.rb

# 以下を追加

attr_accessor :login

ログイン認証用キーをloginに設定


app/models/user.rb

# deviseにパラメータを追加

# devise :database_authenticatable, :registerable,
# :recoverable, :rememberable, :trackable,
# :validatable
# ↓↓
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable,
:validatable, :authentication_keys => [:login]

ログイン認証条件を書き換え(find_first_by_auth_conditionsをオーバーライド)


app/models/user.rb

# 以下を追加

def self.find_first_by_auth_conditions(warden_conditions)
conditions = warden_conditions.dup
if login = conditions.delete(:login)
where(conditions).where(["username = :value OR lower(email) = lower(:value)", { :value => login }]).first
else
where(conditions).first
end
end

usernameのバリデーションを行う場合は任意で設定


app/models/user.rb

validates :username,

:uniqueness => {
:case_sensitive => false
},
:format => { ... } # etc.


Viewの更新

Viewファイル一覧を生成(オーバーライドするため)

$ rails g devise:views

Viewファイルの書き換え

※下記以外の部分は、適時書き換えてください。


app/views/devise/sessions/new.html.erb

<p><%= f.label :email %><br />

<%= f.email_field :email %></p>

↓↓↓書き換え

<p><%= f.label :login %><br />
<%= f.text_field :login %></p>



app/views/devise/registrations/new.html.erb

以下を追加

<p><%= f.label :username %><br />
<%= f.text_field :username %></p>


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

以下を追加

<p><%= f.label :username %><br />
<%= f.text_field :username %></p>


結果

emailまたはusernameでログインが可能になります。