2014-08-27 4 views
5

Lorsque vous utilisez JBuilder, comment puis-je supprimer complètement la preuve d'un élément de tableau vide de ma sortie? Pour cet exemple de code, supposons que nous avons trois utilisateurs et le troisième utilisateur dispose d'une adresse nil:Comment faire pour supprimer complètement un élément vide d'un tableau avec JBuilder

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

Le résultat JSON est:

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

Voir cette dernière, vide {} à la fin là. Donc, chaque fois que le bloc est passé à array! renvoie nil Je me retrouve avec un élément vide dans le tableau, plutôt que d'un manque d'élément. Existe-t-il un moyen facile de dire à JBuilder de ne pas les afficher? Ou dois-je simplement traiter la sortie de array! comme un simple ol 'array puis compact ou reject éléments que je ne veux pas? il retournera

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

Répondre

2

Je pense que vous pouvez éviter votre cas d'utilisation en utilisant d'abord reject sur les utilisateurs, et seulement ajouter les utilisateurs valides au tableau valeur uniquement pour les éléments non-nil

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

Oui, je peux totalement faire cela, et c'est ainsi que je gère le problème en ce moment. Et bien sûr, je ne devrais pas avoir cette logique dans la vue de toute façon. ;) Mais je me demandais juste si/quand cette situation se présente s'il y avait un moyen pour 'array! 'De gérer ce cas pour moi ... –

0

Peut-être que vous pouvez essayer select au lieu de each, un:

+0

Je ne suis pas inquiet de l'utilisateur étant nul dans ce cas, juste une de ses propriétés. Vous avez raison, je ne voudrais pas inclure les utilisateurs nuls, mais le comportement que je vois est que si le bloc lui-même renvoie nil (dans ce cas, quand user.address est nul), j'obtiens un {} vide au lieu de rien du tout. –

Questions connexes