2012-02-14 13 views
3

私は特定のタグのインスタントグラム上のすべての最近の写真を「好き」する素早いハックを構築しようとしています。配列を使ってハッシュから値を繰り返し処理したり取得したりするにはどうすればよいですか?

私が認証され、このようにRubyのハッシュにAPIからJSONを回すためにJSONの宝石を使用しています。これは、元のJSON(例のようにネストされたキーとして配列とハッシュを出力

def get_content (tag_name) 

    uri = URI.parse("https://api.instagram.com/v1/tags/#{tag_name}/media/recent? access_token=#{@api_token}") 

    http = Net::HTTP.new(uri.host, uri.port) 
    http.use_ssl = true 
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE 

    request = Net::HTTP::Get.new(uri.request_uri) 

    json_output = http.request(request) 
    @tags = JSON.parse(json_output.body) 

end 

http://instagr.am/developer/endpoints/tags/

私は繰り返して、すべての "id"を取得しようとしています。私は、各メソッドを使用する場合

は、しかし:

instagram.rb:23:in `[]': can't convert String into Integer (TypeError) 
from instagram.rb:23:in `block in like_content' 
from instagram.rb:22:in `each' 
from instagram.rb:22:in `like_content' 
from instagram.rb:42:in `<main>' 
+1

データはあなたの考えであると確信していますか?あなたが正しくないタイプについて仮定しているように見えます。 –

+1

「@タグ」が何であるかをより深く理解するために、 'p @ tags.class、@ tags'を試してください。 – Phrogz

答えて

15

instagram.rb:23:in `[]': can't convert String into Integer (TypeError) 

puts item["id"]で、itemがあるので、あなたはこのエラーを取得している:

@tags.each do |item| 
    puts item["id"] 
end 

私はエラーを取得します配列、ハッシュではないので、Rubyはあなたが置くものを[] intに変換しようとします。 o整数インデックスですが、文字列("id")なのでできません。

これは、json_output.bodyがハッシュであるという事実から発生します。ドキュメントの例JSONレスポンスで第二を見てみましょう:

{ "data" : [ 
    { "type"  : "image", 
     // ... 
     "id"  : "22699663", 
     "location" : null 
    }, 
    // ... 
    ] 
} 

この全体の構造は、あなたが@tags.eachを呼び出すときに、あなたが実際にHash#eachを呼び出し、そして"data"以降 'している、一つのキー、"data"を持つ単一のハッシュになりitem["id"]を呼び出すときに、値が配列である場合、間違った種類のパラメータを使用してArray#[]を呼び出しています。

@tags = JSON.parse(json_output.body)[ "data" ] 

..then @tagsしたいアレイの代わりにハッシュされ、あなたが望むようにあなたは、そのメンバーを反復処理することができます

かいつまんで、あなたが実際にやってみたいことは、これはおそらくです:

@tags.each do |item| 
    puts item["id"] 
end 
+0

それは動作します!本当にありがとう! –

+0

がよく説明されています。どうもありがとう。私の目的を解決しました。 –

関連する問題