"output" est un OpenStruct sérialisé.Meilleure alternative pour essayer (: output) .try (: data) .try (: nom)?
def titre
essayer (: sortie) .Essayez (: données) .Essayez (: title)
fin
Quoi de mieux? :)
"output" est un OpenStruct sérialisé.Meilleure alternative pour essayer (: output) .try (: data) .try (: nom)?
def titre
essayer (: sortie) .Essayez (: données) .Essayez (: title)
fin
Quoi de mieux? :)
Ou simplement ceci:
def title
output.data.title rescue nil
end
Très succinct, merci! – Jay
Le problème avec cette approche est que, s'il y a quelque chose de mal sur cette chaîne, vous ne le remarquerez pas après qu'il soit trop tard = P – Yaraher
Bien que cela fonctionne bien dans certains cas, c'est un mauvais conseil sans précautions. 'rescue' gère les exceptions, et est par nature beaucoup plus lent –
def try_chain
yield
rescue NoMethodError
nil
end
def title
try_chain { output.data.title }
end
Bonne réponse, merci! – Jay
Thoughtbot vient de parler this on their blog, en utilisant ce qu'ils appellent est un peu profond Nil:
def swallow_nil
yield
rescue NoMethodError
nil
end
Ainsi, dans leur exemple, ils pourraient faire quelque chose comme:
campaign = swallow_nil { supporter.politician.campaign }
Ou, dans votre cas,
def title
swallow_nil { output.data.title }
end
Cependant, sachez que l'un de vos bogues sera également avalé et serait difficile à trouver, spécialement car il piège NoMethodErrors, ce qui serait causé par d'autres parties de votre code (bien que si vous utilisez testing, cela aide beaucoup) .
Une autre approche serait de use andand où votre code serait alors
def title
output.andand.data.andand.title
end
Pas aussi propre que le swallow_nil un, mais sans doute préférable de ne pas ignorer tout.
Bonne réponse, merci! – Jay
Vous devez donner beaucoup plus d'informations avant de poser une telle question abstraite. – Eimantas
La question était claire pour ceux qui répondaient clairement à la question. – Jay