从omniauth保存用户的Facebook数据

时间:2013-09-29 16:47:56

标签: ruby-on-rails facebook facebook-graph-api

我有一个Rails应用程序,用户使用Facebook登录。我想将他们的一些Facebook数据保存到我的数据库中,但我似乎无法访问并保存我要求的额外信息。例如,我想获得Facebook用户的“关于我”信息,您可以通过user_about_me从Facebook Graph API访问该信息,并使用bio进行调用。

我收到此错误:

undefined method 'raw_info' for nil:NilClass

这是必要的代码:

omniauth.rb

OmniAuth.config.logger = Rails.logger

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook, ENV['FACEBOOK_APP_ID'], ENV['FACEBOOK_SECRET'], scope: "email,publish_stream,user_about_me"
end

user.rb

class User < ActiveRecord::Base

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.name = auth.info.name
    user.username = auth.info.nickname
    user.image = auth.info.image
    user.email = auth.info.email
    user.bio = auth.info.extra.raw_info.bio
    user.oauth_token = auth.credentials.token
    user.oauth_expires_at = Time.at(auth.credentials.expires_at)
    user.save!
  end
end

def facebook
  @facebook ||= Koala::Facebook::API.new(oauth_token)
  block_given? ? yield(@facebook) : @facebook
rescue Koala::Facebook::APIError
  logger.info e.to_s
  nil
end
end

sessions_controller.rb

class SessionsController < ApplicationController

def create
  user = User.from_omniauth(env["omniauth.auth"])
  session[:user_id] = user.id
  redirect_to feed_path
end

def destroy
    session[:user_id] = nil
    redirect_to root_url
end
end

为什么我无法访问该信息?

1 个答案:

答案 0 :(得分:1)

需要查看哈希并查看“bio”的位置,但在我的auth哈希

 auth.info.extra.raw_info 

不存在 - 我有

auth.extra.raw_info.bio

我可能会输出Rails.logger.info(auth)来更好地查看所有部分。