在Ruby / Rails中将对象列表呈现为JSON的更简单方法

时间:2012-07-25 05:39:17

标签: ruby-on-rails ruby json list

我想将对象列表呈现为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有点新鲜。有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:2)

尝试使用其他模板系统,例如rabljbuilder

答案 1 :(得分:1)

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

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

{
"id" : <%= @user.id %>,
"progress" : [
    <% @rewards_tapped.each_with_index do |reward, idx|
    %><%= idx == 0 ? '' : ',' %>
    <%= render "rewardprogress", :reward => reward, 
                                     :user => @user
    %><% end %>
]
}