【问题标题】:How to completely remove an empty element from an array with JBuilder如何使用 JBuilder 从数组中完全删除一个空元素
【发布时间】:2023-03-11 07:24:01
【问题描述】:

使用 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! 的输出视为普通的 ol' 数组,然后将 compactreject 元素视为我不想要的?

【问题讨论】:

    标签: ruby-on-rails ruby jbuilder


    【解决方案1】:

    我认为您可以通过首先在用户上使用reject 来避免您的用例,并且只将有效用户添加到数组中:

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

    【讨论】:

    • 是的,我完全可以做到,这就是我现在处理问题的方式。当然,无论如何我都不应该在视图中包含这种逻辑。 ;) 但我只是想知道,如果/何时确实出现这种情况,array! 是否有办法为我处理此案...
    【解决方案2】:

    也许你可以试试select 而不是each,它只会为非零元素返回一个值

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

    【讨论】:

    • 我不担心在这种情况下用户为零,只是它的一个属性。你是对的,我不想包含 nil 用户,但我看到的行为是,如果块本身返回 nil(在这种情况下 user.address 为 nil),那么我会得到一个空的 {} 而不是什么都没有完全没有。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 2020-06-03
    • 2012-06-19
    • 2011-08-18
    • 2019-11-28
    • 1970-01-01
    • 2010-10-04
    相关资源
    最近更新 更多