Deviseでemail以外の項目でログインする

Deviseではemail/passwordでログインするのが標準ですが、
email以外の項目でログインさせたい場合の対応方法です。

migrate

devise:installでできるmigrationファイルを編集して、
ログインにつかう項目を追加します。
今回はaccountを追加します。

      t.string :email                                          # 変更
      t.string :account,            null: false, default: ""   # 追加

add_index :users, :email,                  unique: true # 削除
add_index :users, :account,                unique: true # 追加

View

emailフィールドをaccountに変更します。

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

<div class="field">
  <%= f.label :email%><br />
  <%= f.email_field :email, autofocus: true %>
</div>

<div class="field">
  <%= f.label :account %><br />
  <%= f.text_field :account, autofocus: true %>
</div>

Model

user.rbでemailバリデーションメソッドをオーバーライド

def email_required?
  false
end

devise.rb

config.authentication_keys = [ :account ]

config.case_insensitive_keys = [ :account ]

config.strip_whitespace_keys = [ :account ]