[英]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
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.