2016-04-29 95 views
0

我無法登錄Devise與用戶名,電子郵件不給我任何問題,順便說一句。我遵循了所有的指示,並且用戶名/電子郵件成功地簽了名用戶。我收到的錯誤如下。設計 - 無法用用戶名登錄Rails 4

Started POST "https://stackoverflow.com/users/sign_in" for 127.0.0.1 at 2016-04-29 15:09:09 -0400 
Processing by Devise::SessionsController#create as HTML 
    Parameters: {"utf8"=>"âœ「", "authenticity_token"=>"RL7IXaRa6OOEValataRLI6x3OIky0bOiEstqzJCvYgM5TTg0N3ydRQTY/FjBNXgPHIkuShp2JECeTfI7OM1aqQ==", "user"=>{"login"=>"jonsnow200", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Log in"} 
    User Load (0.0ms) SELECT "users".* FROM "users" WHERE (username = 'jonsnow200' OR lower(email) = lower('jonsnow200')) ORDER BY "users"."id" ASC LIMIT 1 
Completed 401 Unauthorized in 7ms (ActiveRecord: 1.5ms) 
Processing by Devise::SessionsController#new as HTML 
    Parameters: {"utf8"=>"âœ「", "authenticity_token"=>"RL7IXaRa6OOEValataRLI6x3OIky0bOiEstqzJCvYgM5TTg0N3ydRQTY/FjBNXgPHIkuShp2JECeTfI7OM1aqQ==", "user"=>{"login"=>"jonsnow200", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Log in"} 
    Rendered users/sessions/new.html.erb within layouts/application (16.0ms) 
    Rendered navigation/_navbar.html.erb (9.0ms) 
Completed 200 OK in 2339ms (Views: 2229.0ms | ActiveRecord: 0.0ms) 

Application_Controller.rb

class ApplicationController < ActionController::Base 
    before_action :configure_permitted_parameters, if: :devise_controller? 
    # Prevent CSRF attacks by raising an exception. 
    # For APIs, you may want to use :null_session instead. 
    protect_from_forgery with: :exception 

    def redirect_back_or(path) 
    redirect_to request.referer || path 
    end 

    protected 
    def configure_permitted_parameters 
    devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:username, :avatar, :email, :password, :password_confirmation, :remember_me, :avatar_cache, :remove_avatar) } 
    devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:login, :username, :email, :password, :remember_me) } 
    devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:username, :display_name, :age, :gender, :country_id, :email, :avatar, :avatar_cache, :remove_avatar, :password, :password_confirmation, :current_password) } 
    end 
end 

devise.rb

config.authentication_keys = [:login] 
config.case_insensitive_keys = [:email] 
config.strip_whitespace_keys = [:email] 
config.skip_session_storage = [:http_auth] 
config.stretches = Rails.env.test? ? 1 : 10 
config.reconfirmable = true 
config.confirmation_keys = [:username] 
config.expire_all_remember_me_on_sign_out = true 
config.password_length = 8..72 
config.reset_password_keys = [:username] 
config.reset_password_within = 6.hours 
config.scoped_views = true 
config.sign_out_via = :delete 

user.rb

class User < ActiveRecord::Base 
    attr_accessor :login 
    validate :validate_username 
    friendly_id :username, use: :slugged 
    accepts_nested_attributes_for :profile 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable, :token_authenticatable #:encryptable 

    mount_uploader :avatar, AvatarUploader 
    validates :avatar, :presence => true 
    validates_integrity_of :avatar 
    validates_processing_of :avatar 
    validates :username, 
      :presence => true, 
      format: {with: /\A[a-zA-Z0-9]*\z/, message: "may only contain letters and numbers."}, 
      :uniqueness => { 
       :case_sensitive => false, length: {maximum: 16} 
      } 
    validates :email, 
      :presence => true, 
      :uniqueness => { 
       :case_sensitive => false, length: {minimum: 5} 
      } 

    def validate_username 
    if User.where(email: username).exists? 
     errors.add(:username, :invalid) 
    end 
    end 

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

回答

0

我只好換了finder_method的用戶名/電子郵件,因爲我改變了恢復過程以訪問usernam es /電子郵件

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