0

我想将对象列表呈现为 JSON,但我不想使用 to_json,因为我想呈现非常特定的格式和信息子集。

这是我的观点(foo.json.erb):

{
"id" : <%= @user.id %>,
"progress" : [
    <% @rewards_tapped[0..-2].each do |reward| %>
        <%= render "rewardprogress", :reward => reward, 
                                     :user => @user %>,
    <% end %>
    <%= render "rewardprogress", :reward => @rewards_tapped.last, 
                                 :user => @user %>
]
}

如您所见,它非常难看,因为我必须单独渲染@rewards_tapped 中的最后一项,以便它在条目后没有逗号(以生成有效的JSON)。

必须有更好的方法来做到这一点,我对 Ruby 有点陌生。有人可以指出我正确的方向吗?

4

2 回答 2

2

尝试不同的模板系统,如rabljbuilder

于 2012-07-25T05:49:47.267 回答
1

如果您不需要增量渲染,那么您可以简单地构建一个嵌套的哈希/数组 Ruby 数据结构,然后调用#to_json它。您还可以使用符号作为键,它们将成为生成的 JSON 中的字符串键。

假设您确实需要增量渲染,那么这可能是您可以做出的一个小改进(或者可能只是用另一种丑陋代替)。@rewards_tapped如果转换为数组 for速度很慢,这可能会更快[0..-2]

{
"id" : <%= @user.id %>,
"progress" : [
    <% @rewards_tapped.each_with_index do |reward, idx|
    %><%= idx == 0 ? '' : ',' %>
    <%= render "rewardprogress", :reward => reward, 
                                     :user => @user
    %><% end %>
]
}
于 2012-07-25T06:18:49.227 回答