所以我遇到一个问题,即Omni-Auth Facebook没有为SOME(20-30%)用户帐户返回电子邮件地址,因此由于“电子邮件不能为空”错误,帐户将无法注册。“
所以我决定通过根据用户的脸书ID自动生成一个电子邮件地址来解决这个问题,如果omniauth无法获取电子邮件地址...
现在......当然......我的解决方案的问题(正如您将在下面看到的)是它开始保存自动生成的电子邮件地址,无论omniauth是否返回电子邮件地址。 (例如我的电子邮件总是工作正常,但它被替换为123213@facebook.com)
基本上我想要的是:如果用户已经提供了一个电子邮件地址,那么它就会保留原始邮件地址。如果他们没有,并且电子邮件地址无法从omniauth获得,那么它会生成一个新的。
def self.from_omniauth(auth)
where(auth.slice(:provider, :uid)).first_or_initialize.tap do |user|
user.provider = auth.provider
user.uid = auth.uid
user.email = "#{auth.provider}-#{auth.uid}@liquid-radio.com"
user.password = user.password_confirmation = SecureRandom.urlsafe_base64(n=6)
if auth.provider == "facebook"
user.name = auth.info.name
user.email = auth.info.email = "#{auth.uid}@facebook.com"
else
user.oauth_token = auth.credentials.token
user.oauth_expires_at = Time.at(auth.credentials.expires_at)
end
user.save
end
end
答案 0 :(得分:0)
你可能想要移动这一行:
user.email = "#{auth.provider}-#{auth.uid}@liquid-radio.com"
进入“其他”案例,因为它(可能)仅适用于非Facebook用户。
除此之外,请尝试更改此内容:
user.email = auth.info.email = "#{auth.uid}@facebook.com"
到此:
user.email ||= auth.info.email || "#{auth.uid}@facebook.com"
详细说明:
auth.info.email
中有值且用户尚未收到电子邮件,请将其设置为auth.info.email
中没有值,请使用生成的版本你可以在Ruby中以长篇形式写出来:
if user.email
# do nothing
elsif auth.info.email
user.email = auth.info.email
else
user.email = "#{auth.uid}@facebook.com"
end
注意:如果liquid-radio.com行仍然高于if auth.provider
部分,则上述解决方案将无效 - 在这种情况下,用户将始终在电子邮件字段中具有值。
另一个注意事项:如果用户的Facebook电子邮件更改,则此代码不会更新用户的电子邮件。这可能是也可能不是你想要的。