Rails Jbuilder: как отформатировать массив из одного элемента в виде массива JSON?

Я пытаюсь понять, как использовать методы Jbuilder, встроенные в класс. Я хочу принудительно поместить объект в массив длины один, чтобы он соответствовал ожидаемой спецификации 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 и уверен, что есть способ сделать это, но я не могу кажется, не разобрался. Каков синтаксис, чтобы заставить 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

person RSG    schedule 30.10.2014    source источник


Ответы (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
person dddd1919    schedule 30.10.2014
comment
Спасибо за помощь, @dddd. Извините, если вопрос сформулирован плохо, я впервые использую Jbuilder и, вероятно, что-то упускаю. @shipment — это настоящий объект ActiveRecord, shipment — это просто псевдоним для оболочки Jbuilder. sets не является отношением или свойством какого-либо объекта в моем приложении rails, это просто часть спецификации JSON, в которую я пытаюсь экспортировать свою фактическую отгрузку. Спецификация JSON требует массив наборов, поэтому цель состоит в том, чтобы просто принудительно вставить нотацию массива []. Имеет ли это смысл? - person RSG; 30.10.2014
comment
Если просто сериализовать данные в массив, вместо параметров от Jbuilder#array! до [''], таких как Jbuilder.new.array!(['']) do ..., используйте приведенные выше коды. Это ваши средства? - person dddd1919; 30.10.2014
comment
Потрясающий. Это работает - я обновил пример кода, чтобы показать рабочее решение с вашим предложением. Я ненавижу просто слепо внедрять исправление, не понимая, что происходит в синтаксисе — помогите мне понять, как это интерпретируется? - person RSG; 30.10.2014
comment
Документы Jbuilder рассказали вам, как написать шаблон jbuilder, код в шаблоне, поскольку json — это просто экземпляр Jbuilder, поэтому, если вы видите функцию, подобную json.array!(), вы можете напротив использовать Jbuilder.new.array!() в своем ruby-скрипте как euqal. - person dddd1919; 30.10.2014
comment
Большое спасибо за помощь и объяснение. Ваше здоровье. - person RSG; 30.10.2014