次のアクションがあります。
ユーザー.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
(ユーザーが電子メールを入力できる場所) に送信します。
email
ここで、既に取得されている場合にエラーをフラッシュし、ユーザーをリダイレクトする別の if ステートメントを追加します。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)
ですか?