【问题标题】:trying to iterate 3d array | undefined method `each' for nil:NilClass试图迭代 3d 数组 | nil:NilClass 的未定义方法“每个”
【发布时间】:2019-03-06 11:16:20
【问题描述】:

我做错了什么? 数组的前 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"=>"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"=>nil, "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"=>nil, "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"=>nil, "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}},

【问题讨论】:

  • 你能在@jsonData = JSON.parse(response) 之后做raise @jsonData["data"].inspect 并将输出粘贴到问题中吗?
  • 我得到了错误:ApiController#listings 中的 RuntimeError 并列出了所有的硬币/代币
  • 是的,复制并粘贴到问题中。
  • 我做了,但只是一部分,因为它有超过 40'000 个标志,我只能用 30'000 发布

标签: ruby-on-rails multidimensional-array each


【解决方案1】:

你可以试试这个代码和反馈:)

<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 =&gt; value,因为如前所述,我们处理的不是哈希数组。

所以当我做了&lt;% @jsonData.fetch('data', {}).each do |id, coin| %&gt;:

  • id 的值为 '1'
  • coin 具有硬币的结构(您可以静态检索任何数据,例如 coin.dig('quotes', 'USD', 'price')

你在做什么:

&lt;% @jsonData.['data'].each do |coin| %&gt;:

  • coin 将是 ['1', 'structure of the coin here']
  • 当您执行coin['name'] 时,这将返回 nil 但不会失败。此时,您认为它可以正常工作,但事实并非如此。

【讨论】:

  • 但我想了解为什么我的想法没有奏效,它看起来不错,而第一部分奏效了。也许你可以告诉我
  • 是的,我会告诉你 :) 我现在会更新我的帖子,提供更多详细信息。如果它确实解决了您的问题,您可以将我的答案标记为正确,我现在会更新更多详细信息!
  • @HenrikZakaryan 关于price 的值,它不起作用,因为我有一个错字&lt;% 而不是&lt;%=。只需添加=,它应该可以工作:)
  • 是的,我看到了,因为我删除了评论^^。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多