0

我正在努力呈现基于 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 %>

我目前正在视图中工作,但是一旦我对其进行排序,就会将其中的大部分内容移至帮助程序。

谢谢!

4

1 回答 1

1

根据您附加的示例Hash,我怀疑您遇到了困难,因为您尝试像枚举Array一样枚举@invoice["lines"]中的对象。这样做的问题是对象是一个哈希,因此枚举的处理方式略有不同。

由于总是返回键invoiceitemssubscriptionsprorations并且还基于这些类别中的每一个在生成的发票上可能看起来不同的假设,因为它们将具有不同的属性,因此您应该只对中的 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>

虽然我没有完成订阅中的所有字段,但这应该足以作为继续进行的示例。

于 2012-10-19T02:28:57.060 回答