0

我正在尝试学习 koala gem 以将 Facebook 与我的 Ruby on Rails 应用程序链接起来。我开始掌握它的窍门,但我遇到了一些严重的心理障碍!

def friends
  facebook.fql_query("SELECT uid,username, is_app_user, name, pic_square FROM user WHERE uid IN(SELECT uid2 FROM friend WHERE uid1 = me()) AND is_app_user=1");
rescue Koala::Facebook::APIError => e
  logger.info e.to_s
  nil
end

所以,首先,我使用 FQL 来搜索用户的朋友。它返回用户的详细信息哈希,这些用户是 的朋友current_user、登录到应用程序的用户,并且也与我的应用程序连接。

def friends_realname
  names = friends.select {|f| f["is_app_user"] }.map {|f| f["name"]}
  names.each { |name| puts name}
end

我正在选择上面的“用户的朋友也使用我的应用程序”的名称 - 并将它们映射到一个数组中。这将返回一个数组["friend1's name", "friend2's name"]::

def friends_avatars
  @avatars = friends.select {|f| f["is_app_user"] }.map {|f| f["pic_square"]}
end

我正在尝试做同样的事情,但返回相同用户的个人资料图片的 URL。它返回一个数组:

["http://www.example.com/example.jpg", "http://www.example2.com/example2.jpg"]

我想格式化返回数组中的信息。所以,对于真实姓名,我不想返回实际的数组,而是返回一个姓名列表。而且,显然对于图像,而不是返回图像 url 数组,我实际上想将这些图像“放入”视图中。

我在想我需要遍历每个数组,然后使用该each方法对数组中的每个字符串执行某些操作,例如 puts img_tag?

这样的事情可能吗?:

def friends_avatars
  @avatars = friends.select {|f| f["is_app_user"] }.map {|f| f["pic_square"]}
  @avatars.each { |avatar| puts image_tag "#{avatar}}"}
end

刚刚意识到这image_tag是一个辅助方法,所以我不能在那里使用它。

我也在视图文件中试过这个:

<% for url in @avatars do %>
  <%= puts "#{url}" %>
<% end %>

返回:

undefined method `each' for nil:NilClass

每当我尝试返回数组中的字符串时,它们只会返回一个数组。不太确定从这里去哪里。

4

2 回答 2

1
app_users = friends.select{ |f| f["is_app_user"] }
@names_and_pictures = app_users.map{ |f| [ f["name"], f["pic_square"] ] }

这将创建一个二元素数组的数组,即

[ [ "Bob", "http://foo" ], [ "Jim", "http://bar" ] ]

然后你可以并行迭代这些:

<% @names_and_pictures.each do |name,pic_url| %>
  <li><%=name%><img src="<%=pic_url%>"></li>
<% end %>

请注意,您不要puts在视图中使用,因为此函数会将信息输出到控制台。相反,您只需<%= ... %>将 Ruby 代码强制为字符串值并将其注入输出中的适当位置。


您的原始代码很好(只要您将代码包装在命名良好的方法中),但做得太多了。

def friends_realname
  names = friends.select {|f| f["is_app_user"] }.map {|f| f["name"]}
  names.each { |name| puts name}
end

这里不需要puts名字。该方法恰好返回正确的值,因为each返回刚刚迭代的项目。您的方法可以像以下一样有效地编写:

def friends_realname
  friends.select {|f| f["is_app_user"] }.map {|f| f["name"]}
end

def friends_avatars
  friends.select {|f| f["is_app_user"] }.map {|f| f["pic_square"]}
end

如果您碰巧想保留这些方法,可以使用以下方法将两个数组合二为一Array#zip

names   = friends_realname               # One flat array
avatars = friends_avatars                # Another flat array
@names_and_pictures = names.zip(avatars) # An array of two-element arrays
于 2013-01-07T23:57:06.807 回答
0

您对 map 的调用总是返回一个数组。所以当你这样做时:

@avatars = friends.select {|f| f["is_app_user"] }.map {|f| f["pic_square"]}

你得到一个字符串数组。出于您的查看目的,您可以执行以下操作:

<% @avatars.each do |url| %>
  <%= puts "#{url}" %>
<% end %>

希望有帮助

于 2013-01-07T23:59:19.197 回答