0

私はRubyonRailsと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
    }
]

2つの問題:

  1. この「テストアカウント」のFacebookの友達の両方のデータを印刷しています。私は、アプリを使用している友人だけのデータを印刷するようにしようとしています。この場合は、2人の友人のうちの1人だけです。
  2. 次に、データのハッシュ全体を返します。ユーザー名、uid、またはプロフィール写真のみを印刷したい場合、これを行うにはどうすればよいですか?

これまでの経験から、eachブロックを使用してハッシュを反復処理し、間違っている場合は修正してから、すでに接続されているすべてのuidのuid「値」を出力したいと思います。たとえば私のアプリケーション。別のキーを必要とする独自のブロックを書き込もうとしましたが、行き詰まりました。私が期待するように何も機能していないようです。

ハッシュを反復処理し、おそらく条件を使用して、戻り値を特定の値にするにはどうすればよいですか?

4

1 に答える 1

1

これらの友達は両方ともアプリユーザーであるため、元のハッシュは少し間違っていると思います。元のハッシュは

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

2つの異なるアプローチを取ることができます。

  1. 読みやすくなりますが、少し遅くなります(2回の反復が必要です)。

friends.select {| f | f ["is_app_user"]} .map {| f | f ["uid"]}

説明:

selectメソッドは、predicate(condition)に一致するフレンドのみに配列をフィルターします。完全な述語は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

説明:

インジェクトは非常に強力な方法ですが、理解するのが難しい場合があります。空の配列は、app_friends変数の初期値です。インジェクトが機能する方法は、初期値(この場合はapp_friendsとして)を渡し、アクションを実行して次の反復のためにブロックから新しい値を返すことを期待します。ここでのキャッチは、アクションを実行していない場合でも、値を返す必要があるため、最後にapp_friendsがあります。

これらのアプローチはどちらも、アプリユーザーとこれらのユーザーの出力uidのみをフィルタリングします。私の仮定では、出力は次のようになります

=> [100004995550096]

于 2013-01-07T01:15:19.090 に答える