Vérification de zéro dans Ruby on Rails
J'ai travaillé avec des Rails pour un certain temps maintenant, et une chose que je trouve moi-même constamment en train de faire est de vérifier pour voir si un attribut ou un objet est nul à mon avis, le code avant de me l'afficher. Je commence à me demander si c'est toujours la meilleure idée.
Mon raisonnement a été jusqu'ici que depuis mon application(s) s'appuient sur la saisie de l'utilisateur, des choses inattendues peuvent se produire. Si j'ai appris une chose de la programmation en général c'est que les utilisateurs de la saisie de choses que le programmeur n'a pas à penser, c'est l'une des plus grandes sources d'erreurs d'exécution. En vérifiant néant valeurs, je suis en espérant de pas de côté et ont de mon point de vue traiter le problème.
La chose est mais je, pour diverses raisons similaires nulle ou invalide la valeur des chèques dans mon modèle ou le contrôleur de code. Je n'appellerais pas cela de la duplication de code dans le sens le plus strict, mais il ne semble pas très SÈCHE. Si j'ai déjà vérifié pour néant objets dans mon contrôleur est-ce correct si mon point de vue juste suppose que l'objet n'est vraiment pas nul? Pour les attributs qui peuvent être de néant qui sont affiché, il fait sens pour moi de vérifier à chaque fois, mais pour les objets eux-mêmes, je ne suis pas sûr de ce qui est la meilleure pratique.
Ici est simplifié, mais l'exemple typique de ce que je parle:
contrôleur de code
def show
@item = Item.find_by_id(params[:id])
@folders = Folder.find(:all, :order => 'display_order')
if @item == nil or @item.folder == nil
redirect_to(root_url) and return
end
end
afficher le code
<% if @item != nil %>
display the item's attributes here
<% if @item.folder != nil %>
<%= link_to @item.folder.name, folder_path(@item.folder) %>
<% end %>
<% else %>
Oops! Looks like something went horribly wrong!
<% end %>
Est-ce une bonne idée ou est-il tout simplement ridicule?
source d'informationauteur seaneshbaugh | 2010-05-01
Vous devez vous connecter pour publier un commentaire.
Votre code d'exemple refaite:
code du contrôleur. ( Je suppose que c'est ItemsController )
afficher le code, car le contrôleur fait en sorte que nous avons @item
helper code:
De toute façon, j'essaie de garder le point de vue très très simple. Habituellement, si je vois des boucles et des conditions dans les points de vue, j'essaie de refactoriser en des aides.
Non, vous devez utiliser
par exemple
Pour vérifier qu'Un objet est vide si c'est faux, vide ou un espace corde.
utilisation
ref: cette
par exemple
Ne pas oublier .essayez, ce qui a été ajouté dans les Rails 2.3. Cela signifie que vous pouvez appeler quelque chose comme ce qui suit:
Et si @objet est nul, rien n'est retourné. C'est peut-être la solution intégrée pour sameera207 idée.
Idéalement, vous ne devriez pas être l'envoi de néant objets par l'intermédiaire de la vue - mais il n'est pas toujours possible d'éviter.
Personnellement, je pense que si vous êtes à la vérification de
nil
dans votre point de vue (et je pense que depuis le point de vue est l'ultime couche de présentationnil
doivent être vérifiées à ce niveau), vous ne voulez pas vérifier dans le contrôleur. (mais ceci ne s'applique pas à tous les lieux)Je vous recommande de créer une méthode pour vérifier
nil
(pour le rendre peu SEC) et passez de votre objet et vérifier si c'est nul ou pasquelque chose comme:
et l'ajouter dans le contrôleur de l'application et d'en faire un helper (de sorte que vous pouvez l'utiliser dans les deux contrôleurs et les vues)
(
helper_method :is_nil
- ajoutez cette ligne à votre contrôleur d'application)et maintenant, vous pouvez passer de l'objet que vous voulez vérifier si il est nul ou pas.
acclamations,
sameera
Votre contrôleur est responsable de décider de la vue qui va être rendu. Si vous pouvez vérifier que votre contrôleur ne rendent jamais ce point de vue, sans un élément ou item_folder alors vous n'avez pas besoin de vérifier pour néant valeurs.
Par pouvez vérifier je veux dire que vous avez tests/specs que la vérification de la vue qui est rendu nul éléments et item_folders.