0

FacebookをRubyonRailsアプリケーションにリンクするコアラの宝石を学ぼうとしています。私はそれのコツをつかみ始めています、しかし私はいくつかの深刻な精神的なブロックにぶつかっています!

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"] ] }

これにより、2 要素配列の配列が作成されます。つまり、

[ [ "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

これらのメソッドを保持したい場合は、次を使用して 2 つの配列を 1 つに結合できます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 に答える