18

我正在使用设计 2.0 和 gem omniauth-twitter

问题是 twitter 没有发送电子邮件作为响应,所以我的应用程序的模型用户验证有一封电子邮件,我在回调中收到以下错误:

Email can't be blank

我的user.rb模型中有这个:

#config omniauth twitter
def self.find_for_twitter_oauth(access_token, signed_in_resource = nil)
    data = access_token.extra.raw_info
    if user = User.where(:username => data.screen_name).first
        user
    else
        User.create!(:username => data.screen_name, :password => Devise.friendly_token)
    end
end

我的omniauth_callbacks_controller.rb中有这个

  def twitter
    @user = User.find_for_twitter_oauth(request.env["omniauth.auth"], current_user)
    if @user.persisted?
      flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Twitter"
      sign_in_and_redirect @user, :event => :authentication
    else
      # http://stackoverflow.com/questions/7117200/devise-for-twitter-cookie-overflow-error
      session["devise.twitter_data"] = request.env["omniauth.auth"].except('extra')
      redirect_to new_user_registration_url
    end
   end

我想强制用户提供用于发送时事通讯、广告商...等的电子邮件地址

我该如何解决这个问题?

谢谢!

4

4 回答 4

29

将此添加到您的用户模型中:

def email_required?
  super && provider.blank?
end

您可以对密码使用等效方法:

def password_required?
  super && provider.blank?
end

使用 Omniauth 提供程序时,这应该覆盖字段要求。

于 2012-12-12T20:55:25.943 回答
2

我面临同样的问题,Twitter 不会通过 oauth 给你电子邮件,你必须以另一种方式来获取电子邮件。我想出的唯一解决方案是覆盖回调并使用 twitter 数据自动完成表单,让用户有机会自己完成邮件,然后注册并将用户保存在数据库中。

看下面的问题:

有没有办法在使用 OAuth 验证他/她的 Twitter 身份后获取用户的电子邮件 ID?

于 2012-05-03T13:49:42.773 回答
2

在这里彻底解释了一个解决方案:http: //asciicasts.com/episodes/236-omniauth-part-2

并在 GitHub 上: https ://github.com/fertapric/rails3-mongoid-devise-omniauth/wiki/How-To:-Retrieve-email-information-(middle-step)-from-providers-like-Twitter-or -领英

出于某种原因,这个问题在 Google 的排名中比这些链接更高,所以我想我会将它们添加到答案中。

于 2013-01-21T15:19:37.540 回答
0

您需要删除电子邮件字段的存在验证。关注这篇文章,看看是否有效。抱歉回复晚了,希望对您有所帮助。

于 2012-05-01T06:14:25.600 回答