我正在使用Devise和Rails 4.
我正在使用登录屏幕。在登录屏幕中,我传递了用户名/电子邮件和密码,但我必须检查字段用户名或电子邮件中是否有任何一个与系统中的任何用户匹配。
尝试使用用户名或电子邮件查找以下条件,但是如果设计有效密码方法则会出错。
条件:
user = User.where(["username = :value OR email = :value", { :value => username.downcase }])
之后我将用户密码检查为user.valid_password?(password)
错误: NoMethodError(未定义的方法`valid_password?' for#)
对于以下条件valid_password?将工作正常
user = User.find_by(email: email.downcase)
但我必须在::find_by
方法中检查用户名和密码,如下所示
user = User.find_by("email= email.downcase OR username= email.downcase")
有什么方法可以完成上面的事情吗?
答案 0 :(得分:0)
这是最明智的混淆错误,当单个实例混淆了希望关系时,您只是忘记#first
从关系中选择,因为where
返回关系,而不是find_by
,返回单个匹配的记录。所以只需重写(对于rails 5):
user = User.where(email: email.downcase).or(username: email.downcase).first
和带有arel
的Rails 4:
users = User.arel_table
user = User.where(users[:email].eq(downcase).or(users[:username].eq(email.downcase))).first
或部分简单的SQL:
user = User.where(["username = :value OR email = :value", { :value => username.downcase }]).first