gpt4 book ai didi

ruby-on-rails - 在以下 if 语句(Rails)中检查电子邮件是否已被接收?

转载 作者:太空宇宙 更新时间:2023-11-03 17:37:11 25 4
gpt4 key购买 nike

我有以下操作:

用户.rb:

  def omniauth_create
auth = request.env["omniauth.auth"]
user = User.from_omniauth(env["omniauth.auth"])
unless user.email.blank?
if user.id.nil?
# Save the user since he hasn't been created yet
user.save!
end
sign_in user
redirect_back_or user
else
# Send user to a form to fill his email
#session[:omniauth] = request.env['omniauth.auth'].except('extra')
redirect_to(enter_email_path(oprovider: user.provider,
ouid: user.uid,
oname: user.name,
opassword: user.password,
opassword_confirmation: user.password))
end
end

它执行以下操作:

  • 如果用户的 email 不为空,请登录,并将他重定向到他的个人资料(如果他的 idnil,则保存他>. 换句话说,如果他还没有被创建)。
  • 如果用户的email 为空,将他发送到enter_email_path(用户可以在其中输入他的电子邮件)。

现在我想添加另一个 if 语句,如果 email 已经被占用,它会闪烁一个错误,并将用户重定向到 root_path

我不太确定该怎么做,有什么建议吗? (以及将 if 语句放在哪里?)

编辑:

奇怪,得到这个而不是重定向到根路径:

Validation failed: Email has already been taken

我不知道这是否有帮助,但这是 from_omniauth 的来源:

  def self.from_omniauth(auth)
find_by_provider_and_uid(auth["provider"], auth["uid"]) || User.create_with_omniauth(auth)
end

def self.create_with_omniauth(auth)
new do |user|
user.provider = auth["provider"]
user.uid = auth["uid"]
user.name = auth["info"]["name"]
user.email = auth["info"]["email"]
user.password = user.password_confirmation = SecureRandom.urlsafe_base64(n=6)
end
end

现在的代码:

user.rb:

# if user.email.present?
if user.id.nil?
# User.find_by_email(user.email).present?
if User.exists?(:email => user.email)
redirect_to root_path
end
user.save!
end
sign_in user
redirect_back_or user
else

(其余没变)

似乎代码忽略了 if User.exists?(:email => user.email) 部分?

最佳答案

Rails 有一个方法来检查对象是否为 exists基于参数。你可以这样做:

if user.email.present?
if user.id.nil?
if User.exists?(:email => user.email)
# return redirect email is already token
end

# save user
end
# sign_in user
else
# redirect to get email
end

顺便说一句,我不熟悉 Omniauth,所以我不确定什么是正确的,但是 new_record?通常在检查对象是否已保存时使用。如果您有一个 id,它通常是。
如果你感到困惑,你可以在你的用户模型中创建函数以便更好地阅读,比如

class User
def new?
id.nil?
end

def email_taken?
self.class.exists?(:email => email)
end
end

# back to controller
if user.email.present?
if user.new?
if user.email_taken?
# return redirect email is already token
end

# save user
end
# sign_in user
else
# redirect to get email
end

关于ruby-on-rails - 在以下 if 语句(Rails)中检查电子邮件是否已被接收?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13244345/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com