環境は rails4.0.2 devise3.2.2 です。
deviseはデフォルトでメールアドレスとパスワードでの登録となっているのですが、
今回はメールアドレスではなくユーザー名で登録・ログインできるように修正します。
rails g devise userでリソースを作成し、まずは登録機能の修正をします。
userテーブルの修正とview側の修正は適宜行っておいてください。
始めに、POSTしたusernameを登録できるように、application_controller.rbを修正しstrong parameterを設定します。
#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
次にモデル側を修正します。
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に下記を追加します。
devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:username, :password, :remember_me) }
これでログイン時にPOSTしたusernameを利用できるようになります。
次はモデルです。
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のみでログインするようにしましたが、メールアドレスかユーザー名どちらでもログイン可能なように変更する事も可能です。