Как полностью удалить пустой элемент из массива с помощью JBuilder

При использовании JBuilder, как я могу полностью удалить свидетельство о пустом элементе массива из моего вывода? Для этого примера кода предположим, что у нас есть три пользователя, а третий пользователь имеет адрес nil:

json.array! @users.each do |user|
  unless user.address.nil?
    json.name user.name
    json.address user.address
  end
end

Результирующий JSON:

[
  {
    "name":"Rob",
    "address":"123 Anywhere St."
  },
  {
    "name":"Jack",
    "address":"123 Anywhere St."
  },
  {}
]

Обратите внимание на последнее, пустое {} в конце. Поэтому каждый раз, когда блок, переданный в array!, возвращает nil, я получаю пустой элемент в массиве, а не отсутствие элемента. Есть ли простой способ сказать JBuilder не выводить их? Или мне просто нужно обрабатывать вывод array! как обычный массив, а затем compact или reject элементы, которые мне не нужны?


person Rob Cameron    schedule 27.08.2014    source источник


Ответы (2)



Возможно, вы можете попробовать select вместо each, он вернет значение только для элементов, отличных от nil.

json.array! @users.select do |user|
  unless user.address.nil?
    json.name user.name
    json.address user.address
  end
end
person tomsoft    schedule 27.08.2014
comment
Я не беспокоюсь о том, что в этом случае пользователь будет равен нулю, это всего лишь одно из его свойств. Вы правы, я бы не хотел включать нулевых пользователей, но поведение, которое я вижу, заключается в том, что если сам блок возвращает ноль (в данном случае, когда user.address равен нулю), я получаю пустой {} вместо ничего вообще. - person Rob Cameron; 12.09.2014