我正在使用rails5上的设计来确认登录的电子邮件地址。一切正常,直到我单击确认链接。然后它向我显示了这个错误:
name eRnor in Devise ::确认controller#show
未定义的本地变量或方法`signin'for#<班级: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
有人可以帮助我吗?如果您给我一些有关此方法如何工作的信息?
第一件事, attr_accessor
定义了一个实例方法,而不是类方法,因此,如果您在类似self.find_first_by_auth_conditions
的类方法中调用signin
,则会使您置于undefined local variable or method 'signin' for #< Class:0x007fb1cbe56b48>
错误。
第二,您的find_for_database_authentication
方法不完整。您应该按照此示例为基础:
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
我不确定您是否已经将该示例用作基础,但是如果您解释了修改它的原因,那就太好了。我没有理由,请使用该代码。
我在这里发表评论。我不知道您如何处理登录,但是我的操作方式是在会话控制器和会话助手中:
#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