Je souhaite afficher une ligne de texte uniquement si un objet appelé @foo est défini.
À mon avis, j'essaie quelque chose comme ceci: mais cela échoue, retourner des idées? p> p> Vous avez un objet nul quand vous ne l'attendiez pas! Code>
Je suis sûr que cela se produit à cause de la méthode New_Record? Code>.
Comment puis-je vérifier si quelque chose n'est pas un nouvel enregistrement ou nul sans causer une erreur?
En PHP, il serait réalisé en demandant si (! Vide ($ foo)) code> mais même le vide? Code> méthode dans les rails provoque la même erreur d'être renvoyée. p>
7 Réponses :
Je vérifierais par si @foo && @ foo.id code>. Cela vérifie qu'il existe un objet @foo Aciverecord et veille à ce que le champ ID code> n'est pas vide. Si le champ ID CODE> est vide, cela signifie que ce n'est pas un enregistrement dans la base de données. Je suppose que vous utilisez le champ ID code> dans la table. P>
Que diriez-vous:
<% if !@foo.nil? && !@foo.new_record? %> Hello! <% end %>
Vous pourriez également très bien augmenter avec la loi de Demorgan: à moins que @ foo.nil? || @ foo.new_record?; met "bonjour! '; fin; code>
! FOO.NIL? CODE> fait saigner mon cerveau car il peut simplement être remplacé par foo code>. En faisant cela un idiome rubay très simple et courant: si @foo && !@foo.new_record? Code>
Vous pouvez être intéressé par ces aussi:
<%= @foo.text unless @foo.blank? %>
Celles-ci ne vérifient pas si @foo est vide, mais merci pour les méthodes supplémentaires
La manière simple est
Y a-t-il une raison pour laquelle cet objet pourrait être nul quand il arrive à la vue? L'ajout parfois une logique conditionnelle comme celle-ci dans la vue peut être un signe que quelque chose pourrait être refacturé et que vous masquez simplement un problème plus important. P>
Je préfère beaucoup utiliser le And et Gem pour ces chèques.
if @foo.andand.id "Hello!" end
Permettez-moi de jeter une autre réponse juste pour le plaisir.
unless @foo.nil? or @foo.new_record? "Hello" end