自动关注Facebook好友

时间:2014-05-13 20:57:02

标签: ruby-on-rails ruby-on-rails-4

我正在尝试让用户自动关注我的应用中的FB朋友。我能够获得用户的FB朋友的ids,但我不知道如何进行自动跟踪。

我得到他们的朋友' uid(fb id),所以我想我需要在我的应用中找到用户的uid与用户fb好友列表的uid匹配,然后让用户自动关注这些用户。你会怎么做?

user.rb

  has_many :relationships, foreign_key: "follower_id", dependent: :destroy
  has_many :followed_users, through: :relationships, source: :followed
  has_many :reverse_relationships, foreign_key: "followed_id",
                                   class_name:  "Relationship",
                                   dependent:   :destroy
  has_many :followers, through: :reverse_relationships, source: :follower

  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.first_name = auth.info.first_name
        user.last_name = auth.info.last_name
        user.email = auth.info.email
        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

#gets uid of user's fb friends

   def fbfriends
     @graph = Koala::Facebook::API.new(oauth_token)
        begin
          @fbfriends = @graph.get_connections("me", "friends", fields: "id")
          @uids = @fbfriends.map{ |v| v.values }.flatten
        rescue Koala::Facebook::AuthenticationError => e
          redirect_to '/auth/facebook'
        end
          @friends = User.where(uid: @uids)
    end

  def fb_user_id
    self.fbfriends.map{ |v| v.id }
  end

   after_create :follow_fbfriends!

  def follow_fbfriends!
    relationships.create!(followed_id: fb_user_id)
  end

用户秀

<%= @user.fb_user_id %>

浏览器输出

[1]

1 个答案:

答案 0 :(得分:1)

可能的步骤:

  1. @fbfriends中,获取用户朋友的UID个。
  2. @friends = User.where(uid: @fbfriends)将为所有这些UID提供所有用户配置文件。
  3. 对用户和@friends朋友的followers和设置关系进行迭代。
  4. 修改

    可以看出,代码中的@fbfriends返回一个哈希数组,而不是单独的UID。首先,将UID提取为:

    @uids = @fbfriends.map{ |v| v.values }.flatten
    #=> ['1654449181']
    

    现在,使用带有User.where(uid: @uids)的新数组来检索具有这些UID的用户(如果存在)。要设置与用户的关系,您可能需要阅读Michael Hartl's guide chapter

    编辑2 : 在follow_friends!中,您必须遍历您获得的朋友ID,并为每个朋友ID创建关系:

    def follow_fbfriends!
      fb_user_id.each do |friend_id|
        relationships.create!(followed_id: friend_id)
      end
    end