Ruby on rails 魔法宝石Facebook OAuth返回零电子邮件

Ruby on rails 魔法宝石Facebook OAuth返回零电子邮件,ruby-on-rails,ruby,facebook,oauth,sorcery,Ruby On Rails,Ruby,Facebook,Oauth,Sorcery,我正在使用Rails 4.2.1和Ruby 2.2.2上的和外部子模块来实现FacebookOAuth,我遇到了一些问题 我几乎一字不差地按照指示去做,结果失败了。因此,我在oauths_控制器上进行了救援,并对其进行了调试。现在,它给了我一个数据库错误,电子邮件不能为空,这是正确的,我不希望一个用户有/没有电子邮件。为什么巫术会给我空邮件 下面是确切的错误: ERROR: null value in column "email" violates not-null constraint DE

我正在使用Rails 4.2.1和Ruby 2.2.2上的和外部子模块来实现FacebookOAuth,我遇到了一些问题

我几乎一字不差地按照指示去做,结果失败了。因此,我在oauths_控制器上进行了救援,并对其进行了调试。现在,它给了我一个数据库错误,电子邮件不能为空,这是正确的,我不希望一个用户有/没有电子邮件。为什么巫术会给我空邮件

下面是确切的错误:

ERROR:  null value in column "email" violates not-null constraint
DETAIL:  Failing row contains (7, null, null, null, 2015-08-09 23:58:01.39694, 2015-08-09 23:58:01.39694, null, null, null, null, null, f).
以下是相关文件:

# oauths_controller.rb
class OauthsController < ApplicationController
  skip_before_filter :require_login

  def oauth
    session[:return_to_url] = request.referer unless request.referer =~ /oauth/
    login_at(auth_params[:provider])
  end

  def callback
    provider = auth_params[:provider]
    if @user = login_from(provider)
      redirect_back_or_to root_path, :notice => "Logged in from #{provider.titleize}!"
    else
      begin
        @user = create_from(provider)
        reset_session
        auto_login(@user)
        redirect_back_or_to root_path, :notice => "Logged in from #{provider.titleize}!"
      # rescue
        # redirect_back_or_to root_path, :alert => "Failed to login from #{provider.titleize}!"
      end
    end
  end

private
  def auth_params
    params.permit(:provider, :code)
  end
end
以下是整个回购协议,以备不时之需:

提前感谢您的帮助,如果您还需要什么,请告诉我。

我找到了解决方案:

显然这是Facebook API V2.4版的问题。现在,您必须更明确地了解用户路径,所以我刚才添加了

config.facebook.user_info_path = "me?fields=email,first_name,last_name"

它现在正在工作。我为没有检查巫术问题而感到愚蠢。没有错。

我想我已经差不多把它修好了。问题出在我的用户信息映射中。我把它改为config.facebook.user_info_mapping={:email=>name},现在它得到了我的名字和电子邮件。
# sorcery.rb
Rails.application.config.sorcery.submodules = [:external]

Rails.application.config.sorcery.configure do |config|

  config.external_providers = [:facebook]

  config.facebook.key = ENV['FACEBOOK_KEY']
  config.facebook.secret = ENV['FACEBOOK_SECRET']
  config.facebook.callback_url = "http://localhost:5000/oauth/callback?provider=facebook"
  config.facebook.user_info_mapping = {:email => 'email'}
  config.facebook.scope = "email,public_profile"
  config.facebook.display = "page"
  config.facebook.api_version = "v2.4"

  config.user_config do |user|
    user.authentications_class = Authentication
  end
  config.user_class = User
end
config.facebook.user_info_path = "me?fields=email,first_name,last_name"