创建一个与 Facebook 进行大量交互的 Rails 应用程序。我希望用户能够查看其他用户的个人资料,并查看那些从 Facebook 拉入的用户的信息。
我正在使用omniauth-facebook 和koala gems。我在 Facebook 身份验证和 Facebook Graph API 上关注了 Ryan Bates 的 Railscasts 以了解我现在的位置。
我不希望将用户的 Facebook 信息存储在我的数据库中,但这似乎是唯一的方法,因为否则,当我尝试查看可能已注销的另一个用户的个人资料页面时,我得到: "Koala::Facebook::AuthenticationError in Profiles#show"
type: OAuthException, code: 190, error_subcode: 467, message: Error validating access token: The session is invalid because the user logged out. [HTTP 400]
.
有没有办法从 Facebook 引入这些数据,即使该用户已注销?
这是必要的代码:
用户.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.image = auth.info.image
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
session_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
application_controller.rb
class ApplicationController < ActionController::Base
protect_from_forgery
private
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
rescue ActiveRecord::RecordNotFound
end
helper_method :current_user
end
profile_controller.rb
class ProfilesController < ApplicationController
def show
@user = User.find(params[:id])
end
end
profile_helper.rb:
module ProfilesHelper
def facebook_profile_info
@user.facebook.get_object("#{@user.uid}",fields:'gender, locale, bio, birthday,
picture, relationship_status')
end
end
此外,如果您对完成这些任务的方法比我所走的路线有更好的建议,我欢迎您提出建议。