2014-08-27 68 views
5

使用JBuilder时,如何从输出中完全删除空数组元素的证据?对于此代码示例,假设我们有三个用户和第三用户具有nil地址:如何使用JBuilder从阵列中完全删除空元素

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元素作为我不想要的元素?

回答

2

我觉得你可以先在用户使用reject避免你的使用情况,只有合法用户添加到阵列:

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

是的,我完全可以这样做,这就是我现在正在处理的问题。无论如何,我当然不应该有这个逻辑。 ;)但是,我只是想知道,如果/当这种情况确实发生,如果有'阵列!'来处理这种情况对我来说... – 2014-08-27 17:30:11

0

也许你可以试试select代替each,它会返回一个只为非零元素的值

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

我不担心用户在这种情况下零,只是其属性之一。你是对的,我不想包含零用户,但我看到的行为是,如果块本身返回零(在这种情况下,当user.address为零),那么我得到一个空的{}而不是在所有。 – 2014-09-11 20:12:31