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

Facebook Rails 3.2电子邮件地址“如果为空”,facebook,devise,ruby-on-rails-3.2,omniauth,Facebook,Devise,Ruby On Rails 3.2,Omniauth,因此,我遇到了一个问题,Omni Auth Facebook没有为大约20-30%的用户帐户返回电子邮件地址,因此这些帐户不会注册,因为电子邮件不能为空错误 因此,我决定解决这个问题,如果omniauth无法获取电子邮件地址,则根据用户的facebook ID自动生成电子邮件地址 现在。。。当然下面您将看到,我的解决方案的问题是,它开始保存自动生成的电子邮件地址,而不管omniauth是否返回电子邮件地址。例如,我的电子邮件一直运行良好,但它被替换为123213@facebook.com 基本上

因此,我遇到了一个问题,Omni Auth Facebook没有为大约20-30%的用户帐户返回电子邮件地址,因此这些帐户不会注册,因为电子邮件不能为空错误

因此,我决定解决这个问题,如果omniauth无法获取电子邮件地址,则根据用户的facebook ID自动生成电子邮件地址

现在。。。当然下面您将看到,我的解决方案的问题是,它开始保存自动生成的电子邮件地址,而不管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  

您可能需要移动这一行:

user.email = "#{auth.provider}-#{auth.uid}@liquid-radio.com"
至于else,因为它大概只适用于非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中没有值,则punt并使用生成的版本 您可以用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认证发生变化,此代码将不会更新用户的电子邮件。这可能不是您想要的。

谢谢!事实上,在我看到你的回复之前,我确实删除了这一行,因为我不明白为什么我会首先放在那里删除它似乎就可以了,但我会清理一下我的代码。第一个应该是user.email | |=auth.info.email还是user.email | | auth.info.email?奇怪的是,这并没有真正起作用。它将用户登录到。。。但将密码留空。我的猜测是,在authentication.rb中,我需要让attr_可访问:create、:destroy、:index、:provider、:uid、:user_id、:email。我们将对此进行测试。