##概要
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
必須パラメータ設定の書き換え
# 以下を追加
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パラメータのアクセサを設定
# 以下を追加
attr_accessor :login
ログイン認証用キーをloginに設定
# 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をオーバーライド)
# 以下を追加
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のバリデーションを行う場合は任意で設定
validates :username,
:uniqueness => {
:case_sensitive => false
},
:format => { ... } # etc.
##Viewの更新
Viewファイル一覧を生成(オーバーライドするため)
$ rails g devise:views
Viewファイルの書き換え
※下記以外の部分は、適時書き換えてください。
<p><%= f.label :email %><br />
<%= f.email_field :email %></p>
↓↓↓書き換え
<p><%= f.label :login %><br />
<%= f.text_field :login %></p>
以下を追加
<p><%= f.label :username %><br />
<%= f.text_field :username %></p>
以下を追加
<p><%= f.label :username %><br />
<%= f.text_field :username %></p>
##結果
emailまたはusernameでログインが可能になります。