我想将对象列表呈现为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有点新鲜。有人能指出我正确的方向吗?
答案 0 :(得分:2)
答案 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 %>
]
}