2016-12-11 52 views
0

我使用設計上rails5確認電子郵件地址登錄。一切正常,直到我點擊確認鏈接。那麼就說明我這個錯誤:紅寶石軌錯誤電子郵件中色器件

NameError in Devise::ConfirmationsController#show

undefined local variable or method `signin' for #< Class:0x007fb1cbe56b48>

這是導致該錯誤代碼:

 conditions = warden_conditions.dup 
     where(conditions).where(["lower(username) = :value OR lower(email) 
      = :value", { :value => signin.downcase }]).first 

end 

這是我的模型,上面的代碼屬於:

devise :database_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable, :validatable, :confirmable 
attr_accessor :signin 

validates :username, :uniqueness => {:case_sensitive => false} 

def self.find_first_by_auth_conditions(warden_conditions) 
    conditions = warden_conditions.dup 
     where(conditions).where(["lower(username) = :value OR lower(email) 
      = :value", { :value => signin.downcase }]).first 
end 

會有些一個幫助我呢?如果你給我一些關於這種方法如何工作的信息?

+0

乍一看我要說它與登入attr_accessor做。你用它做什麼 ? –

+0

只是用它來簽到 – Shahryar

+0

這將是更好的做標誌使用一個輔助方法,而不是attr_accessor,因爲他們活不長。 –

回答

0

第一件事,attr_accessor定義一個實例方法,而不是一個類的方法,因此,如果調用signin類方法裏像self.find_first_by_auth_conditions是要扔你undefined local variable or method 'signin' for #< Class:0x007fb1cbe56b48>錯誤。

其次,你的find_for_database_authentication方法是不完整的。你應該根據this example基地:

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

我不知道,如果你已經使用的例子作爲基礎,但如果你解釋什麼是你的理由對其進行修改,這將是巨大的。我沒有理由使用這段代碼。

+0

這工作。我使用的代碼來自一本關於設計的書,這本書有點過時,這就是爲什麼我對它感到困惑,而且我仍然是一個初學者,我認爲這是我無法修改它的原因我。謝謝您的幫助。 – Shahryar

0

我後我的answere到您的評論在這裏。我不知道你是如何處理通過登錄,但我做的方式是在會話控制器和會議助手:

#Session Controller 

def create 
    user = User.find_by(email: params[:session][:email].downcase) 
    if user && user.authenticate(params[:session][:email].downcase) 
     log_in user 
     redirect_back_or user 
     flash[:success] = "You are logged in" 
    else 
     flash[:danger] = "Wrong email or password" 
     render 'new' 
    end 
    end 

的「log_in(用戶)」的方法,我用在會話助手定義。

#Session Helper 

    def log_in(user) 
    session[:user_id] = user.id 
    end 
+0

好吧,但這不是什麼即時通訊尋找,因爲即時通訊使用設計登錄 – Shahryar

+0

它給你一個你可以做什麼的想法。 –

相關問題