【问题标题】:How can I verify username or email are correct using Devise and Rails 4如何使用 Devise 和 Rails 4 验证用户名或电子邮件是否正确
【发布时间】:2016-04-29 11:55:42
【问题描述】:

我正在使用 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")

有什么方法可以完成上面的事情吗?

【问题讨论】:

  • 如果您使用的是设计,为什么要手动搜索用户?它为你做到了。如果您想验证设计本身是否正常工作,gem 会附带您可以运行的自己的测试。
  • 你可以使用before_action :authenticate_user!你不需要手动检查
  • 您需要将User.find_by("email= email.downcase OR username= email.downcase") 重写为rails 方式吗?
  • 设计使用 before_action :authenticate_user! 处理它。但是我们如何手动检查API中的数据来自iOS APP呢?

标签: ruby-on-rails devise


【解决方案1】:

这是最明智的混淆错误,当单个实例混合希望关系时,您只需从关系中忘记#first select,因为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

【讨论】:

  • 部分纯 SQL 对我有用。添加了 .first 方法。谢谢。
猜你喜欢
  • 1970-01-01
  • 2014-09-29
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 2015-05-20
  • 1970-01-01
相关资源
最近更新 更多