пытается перебрать массив 3d |неопределенный метод `each 'для nil: NilClass - PullRequest
0 голосов
/ 01 октября 2018

что я делаю не так?Первые 7 строк массива я могу повторить, но когда я пытаюсь открыть другое измерение, чем я получаю сообщение об ошибке.

Мой код

require 'rest-client'

class ApiController < ApplicationController
  def listings
     url = 'https://api.coinmarketcap.com/v2/ticker/'
     response = RestClient.get(url)
     @jsonData = JSON.parse(response)
   end
end

api_controller работает

<h1>LISTING </h1>

<%  @jsonData["data"].each do |coin| %>
        <%coin.each do |id| %>
        Name: <%= id["name"] %> <br />
        Symbol: <% id["symbol"] %><br />
        Website_slug: <% id["website_slug"] %><br />
        Rank: <% id["rank"] %><br />
        Circulating_supply: <% id["circulating_supply"] %><br />
        total_supply: <% id["total_supply"] %><br />
        max_supply: <% id["max_supply"] %><br />

пока здесь это не работает

начните здесь это не работает

        <%id["quotes"].each do |quotes| %>
        <%quotes.each do |usd| %>
        Price: <% usd["price"] %><br />
        Volume24h: <%= usd["volume_24h"] %><br />
        Market_cap: <%= usd["market_cap"] %><br />
        Change_1he: <%= usd["pricpercent_change_1he"] %><br />
        Change_24h: <%= usd["percent_change_24h"] %><br />
        Change_7d: <%= usd["percent_change_7d"] %><br />
            <%end%>
        <%end%>
    <%end%>
<%end%>

{"1" => {"id" => 1, "name "=>" Биткойн "," symbol "=>" BTC "," website_slug "=>" Биткойн "," rank "=> 1," circulating_supply "=> 17298850.0," total_supply "=> 17298850.0," max_supply "=> 21000000.0, "quotes" => {"USD" => {"price" => 6592.56514166, "volume_24h" => 3990509859.95985, "market_cap" => 114043795501.0, "percent_change_1h" => - 0,31, процент_change_24h "=>-0.36, "cent_change_7d "=> - 0.61}}," last_updated "=> 1538393012}," 1027 "=> {" id "=> 1027," name "=>" Ethereum "," symbol "=>" ETH"," website_slug "=>" ethereum "," rank "=> 2," circulating_supply "=> 102298658.0, total_supply" => 102298658.0, "max_supply" => nil, "quotes" => {"USD" =>{"price" => 229.147840966, "volume_24h" => 1701049487.13546, "market_cap" => 23441516679.0, "nium_change_1h "=> - 0,8," percent_change_24h "=> - 2,56, "cent_change_7d" => - 2,44}}, «last_updated» => 1538393021}, «52» => {«id» => 52, «name» => «XRP», «symbol»=> "XRP", "website_slug" => "ripple", "rank" => 3, "circulating_supply" => 39870907279.0, "total_supply" => 99991836919.0, "max_supply" => 100000000000.0, "quotes" => {"USD "=> {" price "=> 0.5790784377," volume_24h "=> 1229031882.79177," market_cap "=> 23088382697.0 ,nium_change_1h" => - 1.6, процента_change_24h "=> - 4,58, процентов_change_7d" => 7,96}}, "last_updated" => 1538393043}, "1831" => {"id" => 1831, "name" => "Bitcoin Cash", "symbol" => "BCH", "website_slug" => "bitcoin-cash"," rank "=> 4," circulating_supply "=> 17378475.0," total_supply "=> 17378475.0," max_supply "=> 21000000.0," quotes "=> {" USD "=> {" price "=> 532.361000338,"volume_24h "=> 480935803.85542," market_cap "=> 9251622335.0, "cent_change_1h" => - 0,78, процент_change_24h "=> - 1,57,« процент_обмен_7d "=> 13,15}},« last_updated »=> 1538393013},« 1765 »> {"id" => 1765, "name" => "EOS", "symbol" => "EOS", "website_slug" => "eos", "rank" => 5, "circulating_supply "=> 906245118.0," total_supply "=> 1006245120.0," max_supply "=> nil," quotes "=> {" USD "=> {" price "=> 5.6494577239," volume_24h "=> 822687391.374753," market_cap "=> 5119793479.0, "cent_change_1h "=> - 0,53," процент_обмен_24h "=> - 3,01," процент_обмен_7d "=> - 1,66}}," last_updated "=> 1538393011}," 512 "=> {" id "=> 512,"name" => "Stellar", "symbol" => "XLM", "website_slug" => "stellar", "rank" => 6, "circulating_supply" => 18789958255.0, "total_supply" => 104323820467.0, "max_supply"=> nil," quotes "=> {" USD "=> {" price "=> 0.261922298," volume_24h "=> 67633971.9905846," market_cap "=> 4921509046.0, "nium_change_1h" => 0,14, "процент_обмен_24ч" =>1.03, "cent_change_7d "=> - 0.49}}," last_updated "=> 1538392997}," 2 "=> {" id "=> 2," name "=>" Litecoin "," symbol "=>" LTC ", "website_slug" => "litecoin", "rank" => 7, "circulating_supply" => 58532552.0, "total_supply" => 58532552.0, "max_supply" => 84000000.0, "quotes" => {"USD" => {"цена" => 60,7806370254, "объем_24ч" => 461333051.026648, "market_cap" => 3557645805.0, "процент_обмен_1ч" => - 0,07, "процент_change_24h "=> - 1.17, "cent_change_7d" => 4.09}},

1 Ответ

0 голосов
/ 01 октября 2018

Вы можете попробовать этот код и обратную связь, пожалуйста:)

<h1>LISTING </h1>

<%  @jsonData.fetch('data', {}).each do |id, coin| %>
  Name: <%= coin['name'] %> <br />
  Symbol: <%= coin['symbol'] %> <br />
  Website_slug: <%= coin['website_slug'] %> <br />
  Rank: <%= coin['rank'] %> <br />
  Circulating_supply: <%= coin['circulating_supply'] %> <br />
  total_supply: <%= coin['total_supply'] %> <br />
  max_supply: <%= coin['max_supply'] %> <br />
  Price: <%= coin.dig('quotes', 'USD', 'price') %> <br />
  Volume24h: <%= coin.dig('quotes', 'USD', 'volume_24h') %> <br />
  Market_cap: <%= coin.dig('quotes', 'USD', 'market_cap') %> <br />
  Change_1he: <%= coin.dig('quotes', 'USD', 'pricpercent_change_1he') %> <br />
  Change_24h: <%= coin.dig('quotes', 'USD', 'percent_change_24h') %> <br />
  Change_7d: <%= coin.dig('quotes', 'USD', 'percent_change_7d') %> <br />
  <%end%>
<%end%>

Это образец вашего JSON:

{
   "data":{
      "1":{
         "id":1,
         "name":"Bitcoin",
         "symbol":"BTC",
         "website_slug":"bitcoin",
         "rank":1,
         "circulating_supply":17298850.0,
         "total_supply":17298850.0,
         "max_supply":21000000.0,
         "quotes":{
            "USD":{
               "price":6592.56514166,
               "volume_24h":3990509859.95985,
               "market_cap":114043795501.0,
               "percent_change_1h":-0.31,
               "percent_change_24h":-0.36,
               "percent_change_7d":-0.61
            }
         },
         "last_updated":1538393012
      },
      "1027":{
         "id":1027,
         "name":"Ethereum",
         "symbol":"ETH",
         "website_slug":"ethereum",
         "rank":2,
         "circulating_supply":102298658.0,
         "total_supply":102298658.0,
         "max_supply":null,
         "quotes":{
            "USD":{
               "price":229.147840966,
               "volume_24h":1701049487.13546,
               "market_cap":23441516679.0,
               "percent_change_1h":-0.8,
               "percent_change_24h":-2.56,
               "percent_change_7d":-2.44
            }
         },
         "last_updated":1538393021
      },
      "52":{
         "id":52,
         "name":"XRP",
         "symbol":"XRP",
         "website_slug":"ripple",
         "rank":3,
         "circulating_supply":39870907279.0,
         "total_supply":99991836919.0,
         "max_supply":100000000000.0,
         "quotes":{
            "USD":{
               "price":0.5790784377,
               "volume_24h":1229031882.79177,
               "market_cap":23088382697.0,
               "percent_change_1h":-1.6,
               "percent_change_24h":-4.58,
               "percent_change_7d":7.96
            }
         },
         "last_updated":1538393043
      },
      "1831":{
         "id":1831,
         "name":"Bitcoin Cash",
         "symbol":"BCH",
         "website_slug":"bitcoin-cash",
         "rank":4,
         "circulating_supply":17378475.0,
         "total_supply":17378475.0,
         "max_supply":21000000.0,
         "quotes":{
            "USD":{
               "price":532.361000338,
               "volume_24h":480935803.85542,
               "market_cap":9251622335.0,
               "percent_change_1h":-0.78,
               "percent_change_24h":-1.57,
               "percent_change_7d":13.15
            }
         },
         "last_updated":1538393013
      },
      "1765":{
         "id":1765,
         "name":"EOS",
         "symbol":"EOS",
         "website_slug":"eos",
         "rank":5,
         "circulating_supply":906245118.0,
         "total_supply":1006245120.0,
         "max_supply":null,
         "quotes":{
            "USD":{
               "price":5.6494577239,
               "volume_24h":822687391.374753,
               "market_cap":5119793479.0,
               "percent_change_1h":-0.53,
               "percent_change_24h":-3.01,
               "percent_change_7d":-1.66
            }
         },
         "last_updated":1538393011
      },
      "512":{
         "id":512,
         "name":"Stellar",
         "symbol":"XLM",
         "website_slug":"stellar",
         "rank":6,
         "circulating_supply":18789958255.0,
         "total_supply":104323820467.0,
         "max_supply":null,
         "quotes":{
            "USD":{
               "price":0.261922298,
               "volume_24h":67633971.9905846,
               "market_cap":4921509046.0,
               "percent_change_1h":0.14,
               "percent_change_24h":1.03,
               "percent_change_7d":-0.49
            }
         },
         "last_updated":1538392997
      },
      "2":{
         "id":2,
         "name":"Litecoin",
         "symbol":"LTC",
         "website_slug":"litecoin",
         "rank":7,
         "circulating_supply":58532552.0,
         "total_supply":58532552.0,
         "max_supply":84000000.0,
         "quotes":{
            "USD":{
               "price":60.7806370254,
               "volume_24h":461333051.026648,
               "market_cap":3557645805.0,
               "percent_change_1h":-0.07,
               "percent_change_24h":-1.17,
               "percent_change_7d":4.09
            }
         }
      }
   }
}

После этого json вы можете видеть, что нет массивов [], это просто вложенные хэши {}, поэтому вам не нужны все ваши циклы.Напримерчтобы получить цену, вам нужно сделать что-то вроде: @jsonData['data']['1']['quotes']['USD']['price']

Этот путь ['data']['1']['quotes']['USD']['price'] полностью статичен, что означает, что он будет одинаковым для каждого coin.единственная динамическая / изменяющаяся часть - ['1'].Иногда это будет ['1'], ['1027'], ['52'] и т. Д.

Так что в моем коде вы можете видеть, что я получаю доступ ко всем данным статически, но только для IDs, который мне пришлось зациклитьнад ним, но этот цикл будет больше key => value, потому что, как упоминалось ранее, мы имеем дело с хэшами, а не массивами.

Итак, когда я сделал <% @jsonData.fetch('data', {}).each do |id, coin| %>:

  • id имеетзначение '1'.
  • coin имеет структуру монеты (вы можете статически извлечь любой фрагмент данных, например coin.dig('quotes', 'USD', 'price'), например,

Что вы гдеделать:

<% @jsonData.['data'].each do |coin| %>:

  • coin будет ['1', 'structure of the coin here']
  • , когда вы сделаете coin['name'], это вернет ноль, но не потерпит неудачуВ этот момент вы думали, что это работает, но это не так.
...