Help us understand the problem. What is going on with this article?

deviseをユーザー名で登録・ログインできるように修正する

More than 5 years have passed since last update.

環境は rails4.0.2 devise3.2.2 です。

deviseはデフォルトでメールアドレスとパスワードでの登録となっているのですが、
今回はメールアドレスではなくユーザー名で登録・ログインできるように修正します。
rails g devise userでリソースを作成し、まずは登録機能の修正をします。
userテーブルの修正とview側の修正は適宜行っておいてください。

始めに、POSTしたusernameを登録できるように、application_controller.rbを修正しstrong parameterを設定します。

application_controller.rb
  #before_filterを設定
  before_filter :configure_permitted_parameters, if: :devise_controller?

  protected

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

次にモデル側を修正します。

user.rb
class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  #usernameを必須・一意とする
  validates_uniqueness_of :username
  validates_presence_of :username

  #登録時にemailを不要とする
  def email_required?
    false
  end

  def email_changed?
    false
  end

end

ポイントはemail_required?とemail_changed?をオーバーライドし、falseを返却するようにしておく点です。
これをしておかないと、登録時にemailが必須になります。

これで登録はできるようになったので、次はログインできるように修正します。

application_controller.rbのconfigure_permitted_parametersに下記を追加します。

application_controller.rb
    devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:username, :password, :remember_me) }

これでログイン時にPOSTしたusernameを利用できるようになります。
次はモデルです。

user.rb
class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable,
         :authentication_keys => [:username]

  #usernameを必須とする
  validates_uniqueness_of :username
  validates_presence_of :username

  #usernameを利用してログインするようにオーバーライド
  def self.find_first_by_auth_conditions(warden_conditions)
    conditions = warden_conditions.dup
    if login = conditions.delete(:login)
      #認証の条件式を変更する
      where(conditions).where(["username = :value", { :value => username }]).first
    else
      where(conditions).first
    end
  end

  #emailを不要とする
  def email_required?
    false
  end

  def email_changed?
    false
  end

end

まず:authentication_keys => [:username]を追加して、認証キーをusernameにするよう設定します。
次にdeviseのfind_first_by_auth_conditionをオーバーライドして認証の条件式を変更します。

今回はusernameのみでログインするようにしましたが、メールアドレスかユーザー名どちらでもログイン可能なように変更する事も可能です。

day-1
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away