2014-08-27 21 views
5

Khi sử dụng JBuilder, làm thế nào tôi có thể loại bỏ hoàn toàn bằng chứng của một phần tử mảng trống từ đầu ra của tôi? Đối với mẫu mã này, giả sử rằng chúng tôi có ba người sử dụng và người sử dụng thứ ba có một địa chỉ nil:Làm thế nào để loại bỏ hoàn toàn một phần tử rỗng khỏi một mảng với JBuilder

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

Các kết quả JSON là:

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

Thấy rằng cuối cùng, trống {} ở cuối đó. Vì vậy, bất kỳ lúc nào khối được chuyển đến array! trả về nil Tôi kết thúc với một phần tử trống trong mảng, thay vì thiếu phần tử. Có cách nào dễ dàng để nói với JBuilder không để sản xuất những? Hay tôi chỉ cần xử lý đầu ra của array! dưới dạng mảng đồng bằng ol 'và sau đó là compact hoặc reject các yếu tố mà tôi không muốn?

Trả lời

2

Tôi nghĩ rằng bạn có thể tránh trường hợp sử dụng của bạn bằng cách đầu tiên sử dụng reject vào người sử dụng, và chỉ làm tăng thêm cho người sử dụng hợp lệ để mảng:

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

Vâng, tôi hoàn toàn có thể làm điều đó, đó là cách tôi xử lý sự cố ngay bây giờ. Và tất nhiên tôi không nên có logic này trong quan điểm nào. ;) Nhưng tôi đã chỉ tự hỏi rằng nếu/khi tình trạng này phát sinh nếu có một cách để 'mảng!' Để xử lý trường hợp này cho tôi ... –

0

Có lẽ bạn có thể thử select thay vì each, nó sẽ trả về một giá trị chỉ dành cho các phần tử không phải là số không

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

Tôi không lo lắng về người dùng là nil trong trường hợp này, chỉ một trong những thuộc tính của nó. Bạn nói đúng, tôi sẽ không muốn bao gồm người dùng nil, nhưng hành vi mà tôi thấy là nếu khối tự trả về nil (trong trường hợp này khi user.address là nil) thì tôi nhận được một {} rỗng thay vì không có gì ở tất cả. –

Các vấn đề liên quan