Rails 3.2电子邮件地址“如果空白”

时间:2013-12-31 10:21:32

标签: facebook devise ruby-on-rails-3.2 omniauth

所以我遇到一个问题,即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  

1 个答案:

答案 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电子邮件更改,则此代码不会更新用户的电子邮件。这可能是也可能不是你想要的。