概要
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でログインが可能になります。