LoginSignup
86
91

More than 5 years have passed since last update.

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

Posted at

概要

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

86
91
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
86
91