Rails
devise

deviseでメールアドレスではなく、ユーザー名でログインできるようにする

More than 1 year has passed since last update.

前提条件

  • deviseが既に導入済みである。
  • Rails 4.2.6
  • devise 4.3.0
  • Userモデルが存在する

はじめに

https://qiita.com/dayone80/items/ce04b21690f5f50a5cfa
https://qiita.com/HamaTech/items/8a4694fa40414aa029ea
これらの記事を参考に自分で実装しようとしたが、deviseのバージョンの違いで詰まったので記録しておく。

Userモデルにnicknameカラムを追加する

$ rails g migration add_username_to_users username:string:uniq

生成されたマイグレーションを実行。
shell-session
$ rake db:migrate

application_controller.rbに追記

/controllers/application_controller.rb
  #以下を追加
  before_filter :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    #strong parametersを設定し、usernameを許可
    devise_parameter_sanitizer.permit(:sign_up) { |u| u.permit(:username, :password, :password_confirmation) }
    devise_parameter_sanitizer.permit(:sign_in) { |u| u.permit(:username, :password, :password_confirmation) }
  end

user.rbに追記

/model/user.rb
  #以下を追加
  validates :username, presence: true, uniqueness: true, length: {maximum: 50}

  #登録時にメールアドレスを不要とする
  def email_required?
    false
  end

  def email_changed?
    false
  end

Viewファイルを書き換える

devise/registrations/edit.html.erbdevise/registrations/new.html.erbdevise/sessions/new.html.erb:email:usernameに変更。

設定ファイルを書き換える

/config/initializers/devise.rb
  config.authentication_keys = [:username]
  config.case_insensitive_keys = [:username]
  config.strip_whitespace_keys = [:username]

authentication_keysはコメントになっているのでコメントを外して:usernameを指定。
そのほかの2つは:emailを:usernameに変えるだけ。