【问题标题】:Rails Jbuilder: how to format an array of one item as a JSON array?Rails Jbuilder:如何将一个项目的数组格式化为 JSON 数组?
【发布时间】:2014-12-25 23:24:24
【问题描述】:

我正在尝试了解如何在类中内联使用 Jbuilder 方法。我想将一个对象强制放入一个长度为 1 的数组中以匹配预期的 JSON 规范。

这是我想要的结果示例(注意 [] 包装了与 sets 关联的值):

{
  "sets": [{
    "set_type": "default_set_type",
    "items": [
      {
        "item_id": "FFFF-0000-111",
        "quantity": "1"
      }
    ]
  }]
}

到目前为止,这是我的方法:

def to_3pl
  @shipment = self
  ...
  Jbuilder.new do |shipment|

    # How do I force jbuilder to wrap a single set with []?
    shipment.sets do
      shipment.set_type 'default_set_type'
      shipment.items @shipment.product_options do |product|
        shipment.item_id product.product_id.to_s
        shipment.quantity product.quantity.to_s
      end
    end
  end
end

这是我的方法生成的JSON(注意与sets关联的值没有被[]包裹):

{
  "sets": {
    "set_type": "default_set_type",
    "items": [
      {
        "item_id": "FFFF-0000-111",
        "quantity": "1"
      }
    ]
  }
}

我查看了Jbuilder docs,并且确信有办法做到这一点,但我似乎无法弄清楚。强制 Jbuilder 在类方法中使用 [] 包装单个元素的语法是什么?

使用解决方案编辑

非常感谢@dddd1919。这是一个成功实现数组包装器的更新方法:

def to_3pl
  @shipment = self
  ...
  Jbuilder.new do |shipment|

    # Forces jbuilder to wrap the object with []
    shipment.sets Jbuilder.new.array!(['']) do |set|
      shipment.set_type 'default_set_type'
      shipment.items @shipment.product_options do |product|
        shipment.item_id product.product_id.to_s
        shipment.quantity product.quantity.to_s
      end
    end
  end
end

【问题讨论】:

    标签: ruby-on-rails json jbuilder


    【解决方案1】:

    如果shipment.sets 是一个列表,您可以使用Jbuilder#array! 将数据序列化为json 数组,例如:

    def to_3pl
      @shipment = self
      ...
      Jbuilder.new do |shipment|
    
        # How do I force jbuilder to wrap a single set with []?
        shipment.sets do
          Jbuilder.new.array!(shipment.sets) do |set|
            ....
          end
        end
      end
    end
    

    【讨论】:

    • 感谢您的帮助,@dddd。抱歉,如果问题措辞不当,这是我第一次使用 Jbuilder,我可能遗漏了一些东西。 @shipment 是一个真正的 ActiveRecord 对象,shipment 只是 Jbuilder 包装器的别名。 sets 不是我的 rails 应用程序中任何对象的关系或属性,它只是我尝试将实际货物导出到的 JSON 规范的一部分。 JSON 规范需要一组集合,因此目标只是强制插入数组表示法[]。这有意义吗?
    • 如果只是序列化为数组数据,而不是Jbuilder#array!['']的参数,如Jbuilder.new.array!(['']) do ...,那么使用你上面的代码。这是你的手段吗?
    • 太棒了。它有效 - 我已经更新了代码示例,以根据您的建议显示有效的解决方案。我讨厌只是盲目地实施修复而不了解语法中发生的事情,以帮助我理解这是如何解释的?
    • Jbuilder docs已经告诉你如何编写一个jbuilder模板,模板中的代码json只是Jbuilder的一个实例,所以如果你看到像json.array!()这样的函数,你可以相反使用@ 987654333@ 在你的 ruby​​ 脚本中作为 euqal。
    • 非常感谢您的帮助和解释。干杯。
    猜你喜欢
    • 2017-12-05
    • 2015-01-04
    • 1970-01-01
    • 2017-07-30
    • 2013-04-17
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 2018-12-28
    相关资源
    最近更新 更多