我有以下动作:
用户.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
不是空白,则让他登录,并将他重定向到他的个人资料(如果他id
是,则保存他nil
。换句话说,如果他还没有被创建)。 - 如果用户
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
现在的代码:
用户.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)
部分?