渲染基于JSON的API响应轨道

时间:2012-10-19 01:15:26

标签: ruby-on-rails json parsing hash nested-loops

我正在努力渲染基于JSON的API的结果,并且正在努力解决如何正确迭代结果。我的API调用的要点:

@invoice = ActiveSupport::JSON.decode(api_response.to_json)

生成的哈希数组如下:

{
"amount_due"=>4900, "attempt_count"=>0, "attempted"=>true, "closed"=>true, 
"currency"=>"usd", "date"=>1350514040, "discount"=>nil, "ending_balance"=>0, "livemode"=>false, 
"next_payment_attempt"=>nil, "object"=>"invoice", "paid"=>true, "period_end"=>1350514040, "period_start"=>1350514040, "starting_balance"=>0, 
"subtotal"=>4900, "total"=>4900, 
"lines"=>{
    "invoiceitems"=>[], 
    "prorations"=>[], 
    "subscriptions"=>[
        {"quantity"=>1, 
            "period"=>{"end"=>1353192440, "start"=>1350514040}, 
            "plan"=>{"id"=>"2", "interval"=>"month", "trial_period_days"=>nil, "currency"=>"usd", "amount"=>4900, "name"=>"Basic"}, 
            "amount"=>4900}
    ]
}}

我正在尝试循环并显示所有“行”以进行渲染和发票。每个“行”可以有0个或多个“invoiceitems”,“prorations”和“subscriptions”。

我已经走到了这一步,但无法想象我们如何处理任何嵌套。

<% @invoice["lines"].each_with_index do |line, index| %>

# not sure what the syntax is here ?

<% end %>

我目前正在视图中工作,但是一旦我对其进行排序,它将把大部分内容转移到帮助器上。

谢谢!

1 个答案:

答案 0 :(得分:1)

基于您附加的示例 Hash ,我怀疑您遇到了困难,因为您试图枚举 @invoice [“lines”] 中的对象你会是一个数组。这个问题是对象是 Hash ,因此枚举的处理方式略有不同。

由于密钥 invoiceitems 订阅 prorations 总是会返回,并且还会假设每个类别可能都会显示由于生成的发票具有不同的属性,因此它们在Hash中的3个值上应该只有3个独立的循环。我编写了一个如何在下面工作的例子:

<% @invoice["lines"]["invoiceitems"].each_with_index do |item, index| %>
  # display logic of an invoice item
<% end %>

<% @invoice["lines"]["prorations"].each_with_index do |proration, index| %>
  # display logic of a proration
<% end %>

<table>
  <tr>
    <th>#</th>
    <th>Quantity</th>
    <th>Start Period</th>
    <th>Amount</th>
  </tr>
  <% @invoice["lines"]["subscriptions"].each_with_index do |subscription, index| %>
  <tr>
    # display logic of a subscription
    <td><%= index %></td>
    <td><%= subscription["quantity"] %></td>
    <td>
      <%= DateTime.strptime("#{subscription["period"]["start"]}",'%s').strftime("%m/%d/%Y") %>
    </td>
  </tr>
  <% end %>
</table>

虽然我没有在订阅中执行所有字段,但这应该是一个继续前进的示例。