【问题标题】:Simpler way to render list of objects as JSON in Ruby/Rails在 Ruby/Rails 中将对象列表呈现为 JSON 的更简单方法
【发布时间】:2023-03-10 07:55:01
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails ruby json list


    【解决方案1】:

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

    【讨论】:

    • 嗯.. 为什么这里需要解析器?
    • 它不是解析器,而是模板系统。
    【解决方案2】:

    如果您不需要增量渲染,那么您可以简单地构建一个嵌套的哈希/数组 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 %>
    ]
    }
    

    【讨论】:

    • 这在某种程度上更干净。至少它是干燥的。感谢您的回答!
    猜你喜欢
    • 2016-02-21
    • 2014-09-22
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多