rails 使用devise用戶名登錄

第一步 創建用戶表的用戶名並執行遷移
    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>

完事記得重啓一下服務

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章