第一步 創建用戶表的用戶名並執行遷移
rails generate migration add_username_to_users username:string:uniq
rails db:migrate
第二步 修改application_controller.rb
class ApplicationController < ActionController::Base
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
added_attrs = [:username, :email, :password, :password_confirmation, :remember_me]
devise_parameter_sanitizer.permit :sign_up, keys: added_attrs
devise_parameter_sanitizer.permit :sign_in, keys: [:login, :password]
devise_parameter_sanitizer.permit :account_update, keys: added_attrs
end
end
第三步 修改model/user.rb
class User < ApplicationRecord
rolify
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
validates :username, presence: true, uniqueness: { case_sensitive: false }
validate :validate_username
def validate_username
if User.where(email: username).exists?
errors.add(:username, :invalid)
end
end
attr_writer :login
def login
@login || self.username || self.email
end
def self.find_first_by_auth_conditions(warden_conditions)
conditions = warden_conditions.dup
if (login = conditions.delete(:login))
where(conditions).where(["lower(username) = :value OR lower(email) = :value", { :value => login.downcase }]).first
else
if conditions[:username].nil?
where(conditions).first
else
where(username: conditions[:username]).first
end
end
end
def self.find_for_database_authentication(warden_conditions)
conditions = warden_conditions.dup
if (login = conditions.delete(:login))
where(conditions).where(["lower(username) = :value OR lower(email) = :value", { :value => login.downcase }]).first
else
where(conditions).first
end
end
end
如果沒有頁面執行
rails g devise:views users
第四步 修改config/initializers/devise.rb
config.authentication_keys = [ :login ]
config.scoped_views = true
config.reset_password_keys = [ :username ]
config.confirmation_keys = [ :username ]
第五步 修改sessions/new.html.erb
- <p><%= f.label :email %><br />
- <%= f.email_field :email %></p>
+ <p><%= f.label :login %><br />
+ <%= f.text_field :login %></p>
第六步 修改registrations/new.html.erb
+ <p><%= f.label :username %><br />
+ <%= f.text_field :username %></p>
<p><%= f.label :email %><br />
<%= f.email_field :email %></p>
第七步 修改registrations/edit.html.erb
+ <p><%= f.label :username %><br />
+ <%= f.text_field :username %></p>
<p><%= f.label :email %><br />
<%= f.email_field :email %></p>
第八步 修改passwords/new.html.erb
- <p><%= f.label :email %><br />
- <%= f.email_field :email %></p>
+ <p><%= f.label :username %><br />
+ <%= f.text_field :username %></p>
第九步 修改confirmations/new.html.erb
- <p><%= f.label :email %><br />
- <%= f.email_field :email %></p>
+ <p><%= f.label :username %><br />
+ <%= f.text_field :username %></p>
完事記得重啓一下服務