2016-09-07 4 views
2

JSONリクエストからハッシュの内部レベルを表示しようとしています。JSONリクエストからハッシュを表示する方法を示します。

これは、JSONリクエストからのリターンです:

{ 
    "results": [ 
    { 
    "utc_offset": -25200000, 
    "venue": { 
     "zip": "94305", 
     "country": "us", 
     "localized_country_name": "USA", 
     "city": "Stanford", 
     "address_1": "750 Escondido Road", 
     "name": "Ray's - Graduate Community Center", 
     "lon": -122.158386, 
     "id": 5612552, 
     "state": "CA", 
     "lat": 37.423393, 
     "repinned": false 
    }, 
    "status": "upcoming" 
    }, 
    { 
    "utc_offset": -25200000, 
    "venue": { 
     "zip": "94306", 
     "country": "us", 
     "localized_country_name": "USA", 
     "city": "Palo Alto", 
     "address_1": "25 Churchill Ave", 
     "name": "Palo Alto High School", 
     "lon": -122.154121, 
     "id": 1566333, 
     "state": "CA", 
     "lat": 37.433186, 
     "repinned": false 
    }, 
    "status": "upcoming" 
    }, 
    { 
    "utc_offset": -25200000, 
    "venue": { 
     "zip": "94306", 
     "country": "us", 
     "localized_country_name": "USA", 
     "city": "Palo Alto", 
     "address_1": "25 Churchill Ave", 
     "name": "Palo Alto High School", 
     "lon": -122.154121, 
     "id": 1566333, 
     "state": "CA", 
     "lat": 37.433186, 
     "repinned": false 
    }, 
    "status": "upcoming" 
    } 
    ] 
    } 
} 
私が言及しました

How to use JSON data returned by API call in Rails 4How to get a second level field from json file using rubyWhy do I get "no implicit conversion of String into Integer (TypeError)"?How to access JSON in Rails?

私はこのポイントを得る助け、私は内側のレベルを表示することができますが"Ray's - Graduate Community Center"を返す@result = @api_response["results"][0]["venue"]["name"]を使用して配列インデックスを指定すると、ハッシュのこれは私が表示しようとしているものですが、インデックス[0]の名前だけでなく、リストのすべての会場の名前を表示したかったのです。しかし、私はどのようにインデックスを反復するか分からない。

私も @result = @api_response["results"]を使用してハッシュ化された結果を表示し、使用を反復処理することができます

<% @result.each do |i| %> 
    <%= i["venue"] %> 
<% end %> 

返す:

{"zip"=>"94305", "country"=>"us", "localized_country_name"=>"USA", "city"=>"Stanford", "address_1"=>"750 Escondido Road", "name"=>"Ray's - Graduate Community Center", "lon"=>-122.158386, "id"=>5612552, "state"=>"CA", "lat"=>37.423393, "repinned"=>false} 
{"zip"=>"94305", "country"=>"us", "localized_country_name"=>"USA", "city"=>"Stanford", "address_1"=>"750 Escondido Road", "name"=>"Ray's - Graduate Community Center", "lon"=>-122.158386, "id"=>5612552, "state"=>"CA", "lat"=>37.423393, "repinned"=>false} 
{"zip"=>"94306", "country"=>"us", "localized_country_name"=>"USA", "city"=>"Palo Alto", "address_1"=>"25 Churchill Ave", "name"=>"Palo Alto High School", "lon"=>-122.154121, "id"=>1566333, "state"=>"CA", "lat"=>37.433186, "repinned"=>false} 
{"zip"=>"94306", "country"=>"us", "localized_country_name"=>"USA", "city"=>"Palo Alto", "address_1"=>"25 Churchill Ave", "name"=>"Palo Alto High School", "lon"=>-122.154121, "id"=>1566333, "state"=>"CA", "lat"=>37.433186, "repinned"=>false} 

{"zip"=>"94306", "country"=>"us", "localized_country_name"=>"USA", "city"=>"Palo Alto", "address_1"=>"25 Churchill Ave", "name"=>"Palo Alto High School", "lon"=>-122.154121, "id"=>1566333, "state"=>"CA", "lat"=>37.433186, "repinned"=>false} 
{"zip"=>"94306", "country"=>"us", "localized_country_name"=>"USA", "city"=>"Palo Alto", "address_1"=>"25 Churchill Ave", "name"=>"Palo Alto High School", "lon"=>-122.154121, "id"=>1566333, "state"=>"CA", "lat"=>37.433186, "repinned"=>false} 

しかし、私はこの使用してみてください:

<% @result.each do |i| %> 
    <%= i["venue"]["name"] %> <br /> 
<% end %> 

undefined method [] 'nil:NilClass`エラーが発生しましたが、tにアクセスできません彼は私が表示しようとしている "会場"の中に "名前"をつけています。

私は適切なトラックにいますか?ハッシュの内部レベルを表示するには良い方法はありますか?どんなフィードバックも役に立ちます。ありがとう!

答えて

1

あなたは正しい軌道にいるようです。そこには、そこに結果があり、その中には何もないか、その中に会場がないということだけです。

どのように問題に近づくかは、そのような状況をどうしたいかによって異なります。

結果をフィルタリングして会場のない結果を除外することができます。あなたのクエリの一部としてこれを行うには、より効率的であるが、あなただけ行うことができます:

@result.select { |r| r.present? && r.has_key?('venue') }.each do |i| 

また、あなたが出力「ノー会場」またはsomesuchできた会場が欠落している場合。このような状況で私はfetchを使う傾向があります。ハッシュから値をフェッチすることはできますが、そのキーがハッシュ内にない場合はデフォルトを返します。したがって、あなたの場合は、次のようにすることができます:

これは結果に会場のハッシュを探しますが、そこにない場合は空のハッシュを返します。 2番目のfetchは、そのハッシュから名前を取得しようとしますが、見つからない場合は'No venue'を返します。

+0

あなたの説明をいただきありがとうございます。両方とも本当にうまく動作します。 'fetch'を実行すると、どのエントリに' 'No venue''があるのか​​分かりました。 1つの質問ですが、この '@result.select {| r | r.present? && r.has_key?( '会場')}。それぞれの| i | '? – teresa

2

resultsアレイのすべてのオブジェクトにvenueフィールドがあることを確認してください。

venueフィールドにアクセスする前に、オブジェクトが実際に存在するかどうかを確認してください。お使いのコントローラでは、これはnilある配列内の任意のオブジェクトを削除します。この

@result = @api_response["results"].reject {|obj| obj.nil?} 

を追加します。

オブジェクトが存在しても、フィールドvenueが存在しない場合はどうなりますか?

<% @result.each do |i| %> 
    <%= i.has_key? "venue" ? i["venue"]["name"] : 'Location unspecified' %> <br /> 
<% end %> 

これが厄介に見える場合は、

def venue_name(obj) 
    obj.has_key? "venue" ? obj["venue"]["name"] : 'Location unspecified' 
end 

のようなヘルパーメソッドに移動し、表示してそれを利用することができます。

<% @result.each do |i| %> 
    <%= venue_name(i) %> <br/> 
<% end %> 
+0

返事をありがとう。私は '<%@ result.each do | i | %> <%= i.has_key? 「会場」? %>
<% end %> 'まだ未定義のメソッド' [] 'がありました。これはnil:NilClass'エラーです。しかし、私は '会場 'が'結果 'の一部、つまりエラーのために欠けているかもしれないことを理解しています。 – teresa

+0

@tshckrそれは変です。 '[venue"] 'を表示できますか? –

+0

うん、それはうまくいくようだが、改行がランダムに出て、それは '会場'フィールドが 'nil'になると思う?上記の私の質問を編集して、 '[venue"] ' – teresa

関連する問題