簡體   English   中英

允許用戶在Devise中使用其用戶名或電子郵件地址登錄

[英]Allow users to sign in using their username or email address with Devise

問題

我遵循了Devise Wiki頁面上教程 ,現在我的登錄頁面已損壞。 我不斷收到錯誤消息,提示“電子郵件或密碼無效”。 user_name和email均無法登錄。

注意:我的用戶名字段是user_name而不是本教程中的username

我錯過了什么? 輸入錯誤的內容? 在大多數情況下,我會剪切粘貼。

應用控制器:

## app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
    protect_from_forgery with: :exception

    before_action :configure_permitted_parameters, if: :devise_controller?

    protected

    def configure_permitted_parameters
        devise_parameter_sanitizer.for(:sign_up) 
            { |u| u.permit( :email, :birthday, :password,:password_confirmation, :remember_me) }
        devise_parameter_sanitizer.for(:sign_in) 
            { |u| u.permit( :login, :user_name, :email, :password, :remember_me ) }
        devise_parameter_sanitizer.for(:account_update) 
            { |u| u.permit( :first_name, :last_name, :user_name, :birthday, 
                            :address_1, :address_2, :city, :state, :zip_code, 
                            :facebook, :twitter, :google_plus, :instagram, :pinterest ) }
    end

end

用戶模型:

## app/models/user.rb

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

    validates :birthday, :presence => true
    validates :user_name, :presence => true, :uniqueness => { :case_sensitive => false }

    # Virtual attribute for authenticating by either user_name or email
    # This is in addition to a real persisted field like 'user_name'
    attr_accessor :login

    def self.find_for_database_authentication(warden_conditions)
      conditions = warden_conditions.dup
      if login = conditions.delete(:login)
        where(conditions.to_h).where(["lower(user_name) = :value OR lower(email) = :value", { :value => login.downcase }]).first
      else
        where(conditions.to_h).first
      end
    end

end

Devise Initializer(不注釋和僅更改此行):

## app/config/initializers/devise.rb

config.authentication_keys = [ :login ]

登錄視圖:

## app/views/devise/sessions/new.html.erb

<% @title="Login" %>

<h2>Log in</h2>

<%= bootstrap_form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>

  <%= f.alert_message "Please fix the errors below." %>

    <%= f.text_field :login, autofocus: true %>
    <%= f.password_field :password %>

    <% if devise_mapping.rememberable? -%>
      <%= f.check_box :remember_me %>
    <% end %>

    <%= f.primary "Log In" %>

<% end %>

<%= render "devise/shared/links" %>

Devise的錯誤標簽(不需要更改,因為我有以下幾行):

## app/config/locales/devise.en.yml

invalid: "Invalid %{authentication_keys} or password."
...
not_found_in_database: "Invalid %{authentication_keys} or password."

預先感謝您提供的任何幫助。

更新問題

使用的版本

Ruby:ruby 2.2.1p85(2015-02-26修訂版49769)[x86_64-darwin14]

Rails:Rails 4.2.0

設計3.4.1

新的ApplicationController代碼

James Milani提供了答案,因為我忘記了重新啟動服務器。 但是,一旦這樣做,ApplicationController代碼便開始出錯,並提供2次重復3次的錯誤。

/app/controllers/application_controller.rb:51: syntax error, unexpected '|', expecting '}' { |u| u.permit( :email, :birthda... ^
/app/controllers/application_controller.rb:51: syntax error, unexpected '}', expecting keyword_end

我像這樣更改了應用程序控制器,錯誤消失了,一切正常:

## app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
    protect_from_forgery with: :exception

    before_action :configure_permitted_parameters, if: :devise_controller?

    protected

    def configure_permitted_parameters
          devise_parameter_sanitizer.for(:sign_up) << :birthday
          devise_parameter_sanitizer.for(:sign_in) << :login
          devise_parameter_sanitizer.for(:account_update) << :first_name
          devise_parameter_sanitizer.for(:account_update) << :last_name
          devise_parameter_sanitizer.for(:account_update) << :user_name
          devise_parameter_sanitizer.for(:account_update) << :birthday
          devise_parameter_sanitizer.for(:account_update) << :address_1
          devise_parameter_sanitizer.for(:account_update) << :address_2
          devise_parameter_sanitizer.for(:account_update) << :city
          devise_parameter_sanitizer.for(:account_update) << :state
          devise_parameter_sanitizer.for(:account_update) << :zip_code
          devise_parameter_sanitizer.for(:account_update) << :facebook
          devise_parameter_sanitizer.for(:account_update) << :twitter
          devise_parameter_sanitizer.for(:account_update) << :google_plus
          devise_parameter_sanitizer.for(:account_update) << :instagram
          devise_parameter_sanitizer.for(:account_update) << :pinterest
    end

end

現在,我不知道為什么其他代碼不起作用,但這是另一個問題。 截至目前,該問題已得到解答。 我剛剛更新了本節,以防以后有人遇到相同的問題。

我通過了您的代碼-看起來不錯; 如果我有50個或更多代表,這將是一個評論,但是您確實重新啟動了服務器,對嗎? 否則,該初始化程序將不會生效。 也許就是這樣嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM