【问题标题】:ruby loop through data returned by API callruby 循环遍历 API 调用返回的数据
【发布时间】:2013-12-03 00:23:31
【问题描述】:

我正在使用 ruby​​ 和 sinatra。使用 Plivo api,我想访问返回的数据,遍历它并提取和打印一些元素的所有实例,并将它们作为 HTML 打印在我的网页上。

我的 ruby​​ 代码是:

user_key = 'my_key'
 params = { 'account' => user_key }
 response = p.get_cdrs(params)
 obj = response.last.to_json

在 Firebug 控制台中返回以下内容:

{
   "api_id":"c59f2008-5baf-11e3-bbb2-22000ac522d1",
   "meta":{
      "limit":20,
      "next":"/v1/Account/MAMTE4MTHJNJRKODBIMD/Call/?account=MAMTE4MTHJNJRKODBIMD&limit=20&offset=20",
      "offset":0,
      "previous":null,
      "total_count":114
   },
   "objects":[
      {
         "bill_duration":21,
         "billed_duration":60,
         "call_direction":"outbound",
         "call_duration":21,
         "call_uuid":"103a3bc6-5baa-11e3-a878-f30f0e86751e",
         "end_time":"2013-12-03 08:33:44+09:00",
         "from_number":"85258081345",
         "parent_call_uuid":"0313c23c-5baa-11e3-a673-f30f0e86751e",
         "resource_uri":"/v1/Account/MAMTE4MTHJNJRKODBIMD/Call/103a3bc6-5baa-11e3-a878-f30f0e86751e/",
         "to_number":"14157638148",
         "total_amount":"0.01200",
         "total_rate":"0.01200"
      },
      {
         "bill_duration":21,
         "billed_duration":60,
         "call_direction":"inbound",
         "call_duration":21,
         "call_uuid":"0313c23c-5baa-11e3-a673-f30f0e86751e",
         "end_time":"2013-12-03 08:33:44+09:00",
         "from_number":"sip:hechan131129083410@phone.plivo.com",
         "parent_call_uuid":null,
         "resource_uri":"/v1/Account/MAMTE4MTHJNJRKODBIMD/Call/0313c23c-5baa-11e3-a673-f30f0e86751e/",
         "to_number":"14157638148",
         "total_amount":"0.00300",
         "total_rate":"0.00300"
      },
      {
         "bill_duration":358,
         "billed_duration":360,
         "call_direction":"inbound",
         "call_duration":358,
         "call_uuid":"0b07abb2-5b40-11e3-8fb1-057cf5362a5f",
         "end_time":"2013-12-02 19:59:58+09:00",
         "from_number":"441903773807",
         "parent_call_uuid":null,
         "resource_uri":"/v1/Account/MAMTE4MTHJNJRKODBIMD/Call/0b07abb2-5b40-11e3-8fb1-057cf5362a5f/",
         "to_number":"441903337012",
         "total_amount":"0.04800",
         "total_rate":"0.00800"
      },
      {
         "bill_duration":344,
         "billed_duration":360,
         "call_direction":"outbound",
         "call_duration":344,
         "call_uuid":"116d89f4-5b40-11e3-8fe5-057cf5362a5f",
         "end_time":"2013-12-02 19:59:57+09:00",
         "from_number":null,
         "parent_call_uuid":"0b07abb2-5b40-11e3-8fb1-057cf5362a5f",
         "resource_uri":"/v1/Account/MAMTE4MTHJNJRKODBIMD/Call/116d89f4-5b40-11e3-8fe5-057cf5362a5f/",
         "to_number":"sip:niyan130903202713@phone.plivo.com",
         "total_amount":"0.01800",
         "total_rate":"0.00300"
      },
      {
         "bill_duration":27,
         "billed_duration":60,
         "call_direction":"outbound",
         "call_duration":27,
         "call_uuid":"1b026a9a-5b3e-11e3-898e-1b5c95282229",
         "end_time":"2013-12-02 19:40:46+09:00",
         "from_number":"85258081345",
         "parent_call_uuid":"19f8572c-5b3e-11e3-8930-1b5c95282229",
         "resource_uri":"/v1/Account/MAMTE4MTHJNJRKODBIMD/Call/1b026a9a-5b3e-11e3-898e-1b5c95282229/",
         "to_number":"441903773807",
         "total_amount":"0.01900",
         "total_rate":"0.01900"
      },
      {
         "bill_duration":27,
         "billed_duration":60,
         "call_direction":"inbound",
         "call_duration":27,
         "call_uuid":"19f8572c-5b3e-11e3-8930-1b5c95282229",
         "end_time":"2013-12-02 19:40:46+09:00",
         "from_number":"sip:hechan131129083410@phone.plivo.com",
         "parent_call_uuid":null,
         "resource_uri":"/v1/Account/MAMTE4MTHJNJRKODBIMD/Call/19f8572c-5b3e-11e3-8930-1b5c95282229/",
         "to_number":"441903773807",
         "total_amount":"0.00300",
         "total_rate":"0.00300"
      },
      {
         "bill_duration":175,
         "billed_duration":180,
         "call_direction":"inbound",
         "call_duration":175,
         "call_uuid":"e59e46f6-5b3a-11e3-8488-1b5c95282229",
         "end_time":"2013-12-02 19:20:16+09:00",
         "from_number":"sip:hechan131129083410@phone.plivo.com",
         "parent_call_uuid":null,
         "resource_uri":"/v1/Account/MAMTE4MTHJNJRKODBIMD/Call/e59e46f6-5b3a-11e3-8488-1b5c95282229/",
         "to_number":"441903773807",
         "total_amount":"0.00900",
         "total_rate":"0.00300"
      },
      {
         "bill_duration":175,
         "billed_duration":180,
         "call_direction":"outbound",
         "call_duration":175,
         "call_uuid":"e698b528-5b3a-11e3-84e1-1b5c95282229",
         "end_time":"2013-12-02 19:20:16+09:00",
         "from_number":"85258081345",
         "parent_call_uuid":"e59e46f6-5b3a-11e3-8488-1b5c95282229",
         "resource_uri":"/v1/Account/MAMTE4MTHJNJRKODBIMD/Call/e698b528-5b3a-11e3-84e1-1b5c95282229/",
         "to_number":"441903773807",
         "total_amount":"0.05700",
         "total_rate":"0.01900"
      },
      {
         "bill_duration":728,
         "billed_duration":780,
         "call_direction":"outbound",
         "call_duration":728,
         "call_uuid":"b421ca72-5b34-11e3-82c5-1b5c95282229",
         "end_time":"2013-12-02 18:45:04+09:00",
         "from_number":"85258081345",
         "parent_call_uuid":"b3210c64-5b34-11e3-8250-1b5c95282229",
         "resource_uri":"/v1/Account/MAMTE4MTHJNJRKODBIMD/Call/b421ca72-5b34-11e3-82c5-1b5c95282229/",
         "to_number":"85265001927",
         "total_amount":"0.33800",
         "total_rate":"0.02600"
      },
      {
         "bill_duration":728,
         "billed_duration":780,
         "call_direction":"inbound",
         "call_duration":728,
         "call_uuid":"b3210c64-5b34-11e3-8250-1b5c95282229",
         "end_time":"2013-12-02 18:45:04+09:00",
         "from_number":"sip:hechan131129083410@phone.plivo.com",
         "parent_call_uuid":null,
         "resource_uri":"/v1/Account/MAMTE4MTHJNJRKODBIMD/Call/b3210c64-5b34-11e3-8250-1b5c95282229/",
         "to_number":"85265001927",
         "total_amount":"0.03900",
         "total_rate":"0.00300"
      },
      {
         "bill_duration":800,
         "billed_duration":840,
         "call_direction":"outbound",
         "call_duration":800,
         "call_uuid":"49c4bc6a-5b30-11e3-aa2e-f30f0e86751e",
         "end_time":"2013-12-02 18:14:41+09:00",
         "from_number":"85258081345",
         "parent_call_uuid":"43465b3c-5b30-11e3-a842-f30f0e86751e",
         "resource_uri":"/v1/Account/MAMTE4MTHJNJRKODBIMD/Call/49c4bc6a-5b30-11e3-aa2e-f30f0e86751e/",
         "to_number":"818042010550",
         "total_amount":"2.01600",
         "total_rate":"0.14400"
      },
      {
         "bill_duration":800,
         "billed_duration":840,
         "call_direction":"inbound",
         "call_duration":800,
         "call_uuid":"43465b3c-5b30-11e3-a842-f30f0e86751e",
         "end_time":"2013-12-02 18:14:41+09:00",
         "from_number":"sip:hechan131129083410@phone.plivo.com",
         "parent_call_uuid":null,
         "resource_uri":"/v1/Account/MAMTE4MTHJNJRKODBIMD/Call/43465b3c-5b30-11e3-a842-f30f0e86751e/",
         "to_number":"818042010550",
         "total_amount":"0.04200",
         "total_rate":"0.00300"
      },
      {
         "bill_duration":2,
         "billed_duration":60,
         "call_direction":"outbound",
         "call_duration":2,
         "call_uuid":"7f1db12e-5a7b-11e3-9c03-c7a22946c980",
         "end_time":"2013-12-01 20:27:08+09:00",
         "from_number":"185258081345",
         "parent_call_uuid":"7e6225d0-5a7b-11e3-9bd4-c7a22946c980",
         "resource_uri":"/v1/Account/MAMTE4MTHJNJRKODBIMD/Call/7f1db12e-5a7b-11e3-9c03-c7a22946c980/",
         "to_number":"sip:hechan131129083410@phone.plivo.com",
         "total_amount":"0.00300",
         "total_rate":"0.00300"
      },
      {
         "bill_duration":2,
         "billed_duration":60,
         "call_direction":"inbound",
         "call_duration":2,
         "call_uuid":"7e6225d0-5a7b-11e3-9bd4-c7a22946c980",
         "end_time":"2013-12-01 20:27:08+09:00",
         "from_number":"185258081345",
         "parent_call_uuid":null,
         "resource_uri":"/v1/Account/MAMTE4MTHJNJRKODBIMD/Call/7e6225d0-5a7b-11e3-9bd4-c7a22946c980/",
         "to_number":"14154292111",
         "total_amount":"0.00850",
         "total_rate":"0.00850"
      },
      {
         "bill_duration":1628,
         "billed_duration":1680,
         "call_direction":"outbound",
         "call_duration":1628,
         "call_uuid":"108c1c14-5a76-11e3-a749-1b5c95282229",
         "end_time":"2013-12-01 20:15:25+09:00",
         "from_number":"85258081345",
         "parent_call_uuid":"0f78d9c0-5a76-11e3-a6af-1b5c95282229",
         "resource_uri":"/v1/Account/MAMTE4MTHJNJRKODBIMD/Call/108c1c14-5a76-11e3-a749-1b5c95282229/",
         "to_number":"441903773807",
         "total_amount":"0.53200",
         "total_rate":"0.01900"
      },
      {
         "bill_duration":1628,
         "billed_duration":1680,
         "call_direction":"inbound",
         "call_duration":1628,
         "call_uuid":"0f78d9c0-5a76-11e3-a6af-1b5c95282229",
         "end_time":"2013-12-01 20:15:25+09:00",
         "from_number":"sip:hechan131129083410@phone.plivo.com",
         "parent_call_uuid":null,
         "resource_uri":"/v1/Account/MAMTE4MTHJNJRKODBIMD/Call/0f78d9c0-5a76-11e3-a6af-1b5c95282229/",
         "to_number":"441903773807",
         "total_amount":"0.08400",
         "total_rate":"0.00300"
      },
      {
         "bill_duration":57,
         "billed_duration":60,
         "call_direction":"outbound",
         "call_duration":57,
         "call_uuid":"ce7f25f6-5a6f-11e3-ae45-f30f0e86751e",
         "end_time":"2013-12-01 19:04:37+09:00",
         "from_number":"85258081345",
         "parent_call_uuid":"c938e38e-5a6f-11e3-aca3-f30f0e86751e",
         "resource_uri":"/v1/Account/MAMTE4MTHJNJRKODBIMD/Call/ce7f25f6-5a6f-11e3-ae45-f30f0e86751e/",
         "to_number":"441903773807",
         "total_amount":"0.01900",
         "total_rate":"0.01900"
      },
      {
         "bill_duration":57,
         "billed_duration":60,
         "call_direction":"inbound",
         "call_duration":57,
         "call_uuid":"c938e38e-5a6f-11e3-aca3-f30f0e86751e",
         "end_time":"2013-12-01 19:04:37+09:00",
         "from_number":"sip:hechan131129083410@phone.plivo.com",
         "parent_call_uuid":null,
         "resource_uri":"/v1/Account/MAMTE4MTHJNJRKODBIMD/Call/c938e38e-5a6f-11e3-aca3-f30f0e86751e/",
         "to_number":"441903773807",
         "total_amount":"0.00300",
         "total_rate":"0.00300"
      },
      {
         "bill_duration":126,
         "billed_duration":180,
         "call_direction":"outbound",
         "call_duration":126,
         "call_uuid":"24ed88a4-5a59-11e3-a462-fdc08976d83f",
         "end_time":"2013-12-01 16:23:39+09:00",
         "from_number":"185258081345",
         "parent_call_uuid":"2445b890-5a59-11e3-a437-fdc08976d83f",
         "resource_uri":"/v1/Account/MAMTE4MTHJNJRKODBIMD/Call/24ed88a4-5a59-11e3-a462-fdc08976d83f/",
         "to_number":"818088931617",
         "total_amount":"0.43200",
         "total_rate":"0.14400"
      },
      {
         "bill_duration":126,
         "billed_duration":180,
         "call_direction":"inbound",
         "call_duration":126,
         "call_uuid":"2445b890-5a59-11e3-a437-fdc08976d83f",
         "end_time":"2013-12-01 16:23:39+09:00",
         "from_number":"185258081345",
         "parent_call_uuid":null,
         "resource_uri":"/v1/Account/MAMTE4MTHJNJRKODBIMD/Call/2445b890-5a59-11e3-a437-fdc08976d83f/",
         "to_number":"14154292111",
         "total_amount":"0.02550",
         "total_rate":"0.00850"
      }
   ]
}

抱歉,时间太长了。

现在,我想访问数据的某些部分并将其打印为 HTML,例如,所有 bill_durations 和所有 call_directions。我怎样才能做到这一点?

当我尝试时:

obj.each do |row|
   bill_duration = ob["objects"][0]["bill_duration"]
  halt 200, { :bill_duration => bill_duration }
  end

heroku 错误是:

NoMethodError - undefined method `each' for #<String:0x007f82e6448b38>

这里有什么问题?谢谢大家!

好的,这就是我现在所拥有的:

response.last['objects'].each do |row| 
 bill_duration = row["bill_duration"] 
 halt 200,  { :bill_duration => bill_duration }.to_json 
 end

这不会产生错误,但它只返回一条记录,尽管有循环。我需要获取 bill_duration 的所有实例。

【问题讨论】:

    标签: ruby sinatra plivo


    【解决方案1】:

    实际上,.to_json 生成一个字符串,而不是一个哈希,这就是为什么你得到你得到的错误。它非正式地记录在http://www.ruby-doc.org/stdlib-2.0/libdoc/json/rdoc/JSON.html#module-JSON-label-Generating+JSON

    您可以使用JSON.parse 将该字符串转回对象,也可以直接对response.last 进行操作。但是,在任何一种情况下,请注意该对象将是一个 hash,而不是一个数组,因此您必须从中选择 objects 元素,然后才能开始遍历 objects 数组,如:

    response.last['objects'].each
    

    JSON.parse(obj)['objects'].each
    

    【讨论】:

    • 谢谢。这是我现在所拥有的: response.last['objects'].each do |row| bill_duration = row["objects"][0]["bill_duration"] halt 200, { :bill_duration => bill_duration }.to_json end 错误是 NoMethodError - undefined method `[]' for nil:NilClass: 我真的卡住了!
    • row[objects] 是一个散列,而不是一个数组。 row[objects][0]nil,给你错误。摆脱[0]
    • 另外,您应该使用修改后的代码/结果更新您的问题,因为由于缺少换行符,您无法真正阅读 cmets 中的代码。或者,使用分号分隔注释中的行。
    • 谢谢,仍然卡住但正在取得进展。请参见上文。
    【解决方案2】:

    在 Peter Alfvin 的帮助下,答案是:

    results =  response.last['objects'].each do |row| 
      bill_duration = row["bill_duration"]
      { :bill_duration => bill_duration }
      end
     halt 200,  results.to_json 
     end
    

    然后可以访问并打印出来,用jQuery,如下:

    $.getJSON("/callrecords", function(data) {
            $.each( data, function( key, value ) {
            var txt = '<p>' +this["bill_duration"]+ '</p>';
          $(".results").append(txt);
         });//end each
        });//end JSON
    

    太棒了,多年来,我一直在为此苦苦挣扎。谢谢彼得!!

    【讨论】:

    • 鉴于我回答了您关于错误的问题并通过 cmets 提供了额外帮助,看到您“不接受”我的回答,我感到非常惊讶。至少,我认为此时应该进行“投票”。此外,我们这些老年人需要互相支持。 ;-)(我注意到我们同岁)。
    猜你喜欢
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    • 2021-03-25
    相关资源
    最近更新 更多