2014-08-27 9 views
5

Quando si utilizza JBuilder, come posso rimuovere completamente la prova di un elemento di array vuoto dal mio output? Per questo esempio di codice, si supponga di avere tre utenti e il terzo utente ha un indirizzo nil:Come rimuovere completamente un elemento vuoto da un array con JBuilder

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

Il JSON risultante è:

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

Vedi quell'ultimo, vuoto {} alla fine lì. Quindi, ogni volta che il blocco passa a array! restituisce nil. Finisco con un elemento vuoto nell'array, piuttosto che una mancanza di elemento. C'è un modo semplice per dire a JBuilder di non produrre quelli? O devo semplicemente considerare l'output di array! come un semplice array ol 'e quindi gli elementi compact o reject che non desidero?

risposta

2

Penso che si possa evitare il vostro caso d'uso in primo luogo utilizzando reject sugli utenti, e solo aggiungere gli utenti validi alla matrice:

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

Sì, potrei farlo completamente, ecco come sto gestendo il problema adesso. E ovviamente non dovrei avere questa logica comunque. ;) Ma mi stavo chiedendo che se/quando questa situazione si presentasse se ci fosse un modo per 'array!' Per gestire questo caso per me ... –

0

forse si può provare select invece di each, verrà restituito un valore solo per elementi non nulli

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

Non sono preoccupato che l'utente sia nullo in questo caso, solo una delle sue proprietà. Hai ragione, non vorrei includere utenti nil, ma il comportamento che sto vedendo è che se il blocco stesso restituisce nil (in questo caso quando user.address è nullo), allora ottengo un vuoto {} invece di niente affatto. –

Problemi correlati