如何使用JBuilder从数组中完全删除空元素

5

在使用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! 的输出当作普通的数组,然后 compactreject 不想要的元素?
2个回答

2

我认为你可以通过首先在用户上使用reject,然后只将有效的用户添加到数组中来避免使用情况:

json.array! @users.reject { |user| user.address.nil? }.each do |user|
  json.name user.name
  json.address user.address
end

是的,我完全可以做到这一点,这也是我目前处理问题的方式。当然,我不应该在视图中使用这种逻辑。;) 但我只是想知道如果/当这种情况出现时,是否有一种方法让array!为我处理这种情况... - Rob Cameron

0
也许你可以尝试使用select而不是each,它只会返回非空元素的值。
json.array! @users.select do |user|
  unless user.address.nil?
    json.name user.name
    json.address user.address
  end
end

在这种情况下,我不担心用户为空,只是其中一个属性为空。你说得对,我不想包含空用户,但我看到的行为是,如果块本身返回nil(在这种情况下,当user.address为空时),那么我会得到一个空的{}而不是什么都没有。 - Rob Cameron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接