0

我正在尝试使用 Ruby on Rails 和 Facebook。我是 Rails 的新手,我一直很难理解 StackOverflow 上已经存在的许多其他答案。

您可以在这里查看我的模型 user.rb:http: //pastebin.com/nckSsKWM和我的视图 index.html.erb 在这里: http: //pastebin.com/8UXGN8Ri

到目前为止,我所做的是将 Facebook 返回的哈希打印到我的视图中。我可以让它打印出我所有用户的“朋友”的所有数据 - 但它会以散列形式打印:

Number of friends: 2

App Friends: 

[
    {
        "uid"=>100004995550096,
        "username"=>"",
        "is_app_user"=>true
    }, 
    {
        "uid"=>100005005780053,
        "username"=>"",
        "is_app_user"=>true
    }
]

两个问题:

  1. 它正在打印这个“测试帐户”的两个 Facebook 朋友的数据。我一直试图让它只打印也在使用该应用程序的朋友的数据 - 在这种情况下,它只是两个朋友之一。
  2. 其次,它返回整个数据散列。如果我只想打印出用户名、uid 或个人资料图片,我该怎么做呢?

根据我目前的经验,我想遍历哈希,使用一个each块,如果我错了,请纠正我,然后我希望它打印出它们已经连接到的所有 uid 的 uid“值”例如我的应用程序。我试图编写自己的块,需要不同的键,但我被卡住了。似乎没有什么能像我期望的那样工作。

我怎样才能遍历一个哈希,并让返回值成为某些值,甚至可能使用条件?

4

1 回答 1

1

我相信您的原始哈希有点不正确,因为这两个朋友都是应用程序用户。我假设你原来的哈希是

friends = [
    {
        "uid"=>100004995550096,
        "username"=>"",
        "is_app_user"=>true
    }, 
    {
        "uid"=>100005005780053,
        "username"=>"",
        "is_app_user"=>false
    }
]

您可以采取两种不同的方法。

  1. 更容易阅读但有点慢(需要两次迭代)。

朋友。选择 {|f| f["is_app_user"] }.map {|f| f["uid"]}

解释:

Select 方法将数组过滤为仅匹配谓词(条件)的朋友。完整的谓词是 f["is_app_user"] == true 但我在这里使用了快捷方式。最后,它返回与谓词匹配的新项目数组。Map 方法执行投影以仅在已过滤的朋友数组上过滤我们感兴趣的字段。

  1. 阅读速度更快,但可能更难理解,特别是如果您是 Ruby 新手。
friends.inject([]) do |app_friends,friend| 
  app_friends << friend["uid"] if friend["is_app_user"]
  app_friends
end

解释:

Inject 是一种非常强大的方法,但有时会让人难以理解。空数组是 app_friends 变量的初始值。注入的工作方式是将初始值传递给您(在我们的例子中为 app_friends),并期望您对其执行操作并从块中返回新值以进行下一次迭代。如果我们没有执行任何操作,这里的问题仍然需要返回值,这就是我们最后有 app_friends 的原因。

这两种方法都只过滤应用用户和这些用户的输出 uid。根据我的假设,输出将是

=> [100004995550096]

于 2013-01-07T01:15:19.090 回答