J'ai le code rubis très laids suivant dans une application Rails, je travaille sur:
if params[:search][:tags_name_in].present?
6 Réponses :
parames sera toujours défini, de sorte que vous puissiez supprimer cela.
Pour réduire la quantité de code que vous pouvez faire P> si paramètres [: recherche ] code> n'est pas défini, la condition sera courte et retourner
nil code>. p> p>
J'ai édité de l'indiquer son retour nil code>, pas
false code>.
Vous supposez que ce code est dans un contrôleur de rails. À l'intérieur d'une classe, les paramètres peuvent être indéfinis ou nul.
Je finis généralement à faire quelque chose comme ceci:
if params[:search] && params[:search][:tags_name_in] ...
Vous pouvez utiliser And et pour cela. Il gère cette situation exacte: p>
Si les params [: recherche] .and [: tags_name_in] .andand.present? code> p>
C'est un joyau très cool, merci pour la pointe!
+1 Si seulement tout le monde utilisait et et dans ces cas (même si je préfère écrire l'équivalent eck's "peut-être") au lieu de conditionnels et de plus de conditionnels (ou de laid "essayer")
haha, si vous voulez être terrible et soinyyyypatch nil: Je recommanderais un court-circuité si comme les autres réponses suggèrent, cependant. P> P>
Pourquoi est-ce mauvais? Me semble assez bon.
Si vous essayez simplement de voir si c'est défini pourquoi ne pas le garder simple et utiliser le défini? fonctionner?
if defined?(params[:search][:tags_name_in])
Cela n'est pas équivalent au code qu'il a initialement demandé concernant. défini? code> retournera true si une variable a été initialisée, même si elle est définie sur
nil code>.
Present? Code> Vérifie à l'aide de
vide? code>, donc
nil code> retournera false.
Bien sûr, mais la question dit qu'il demande simplement s'il a été défini ou non - lequel cela fera.
C'est la réponse la plus propre, il se trouve aussi mal.
alors clarifiante sur la question alors - cherchez-vous défini ou non nul?
OK - Une fois les tests dans mon cas particulier défini fonctionnent parfaitement. Il n'y a pas de situation dans mon application où: tags_name_in peut être défini et nul - mais même s'il a été défini et que la nul qui ne soulève aucune erreur, rien n'arrive (qui est le comportement souhaité). Donc, j'aime cette approche pour ma situation.
@Andrew si params [: recherche] [: tags_name_in] code> est nul,
défini? Code> ne lancera aucune erreur, il retournera la chaîne "variable locale" ou de ce type , qui, à un
si code> déclaration est vrai. Ce n'est pas parce que cela va travailler en ce moment, pour vous, ne fait pas une bonne solution. Le point est que le comportement de défini? n'est pas immédiatement évident ni intuitif, et à l'avenir, vous ou la personne qui prenant votre code peut être mal piqué. L'utilisation de cette approche sacrifie la maintenabilité afin d'économiser 9 caractères.
L'autre problème est que d'utiliser cette valeur, vous devrez écrir cette chaîne de symboles et de crochets, créant ainsi un deuxième point de défaillance et enfreindre le sec.
Vous avez de nombreux choix qui retourneront la valeur de clair mais long: p> utilisant à l'aide de sauvetage: p> utilisant param 'params [: recherche] [: tags_name_in] code> ou
nil code> si
params [: recherche] code > est
nil code>.
essayer code> (à partir de
actif_support Code>): p>
Fetch code>: P >
def deal_with_tags
MyModel.where :tags => params.fetch(:search){ return }[:tags_name_in]
end
+1. J'étais sur le point de poster le essayer code> et
Fetch code> solution. J'ai cessé d'utiliser en ligne
sauvetage code> après avoir trouvé le coût de la manipulation des exceptions dans Ruby.
La méthode de récupération semble très utile, je vais le regarder et je pourrais peut-être l'utiliser à plusieurs endroits!
OP doit traiter des paramètres elles-mêmes! Cette réponse lancerait toujours des erreurs dans ce cas.
Une note sur la réponse que je choisis: Dans mon application, il n'est pas important si cette condition renvoie
nil code> ou
false code>, pas plus important que
: tags_name_in code> Ne soyez pas vide, j'ai juste besoin de tester si
: tags_name_in code> est défini sans élever une erreur. Donc, pour ma situation, j'aime le
défini? Code> Approche comme indiqué par AYD. Cependant, je pense que Mike Lewis approche peut être plus utile pour d'autres personnes ayant besoin d'éviter de transmettre une valeur nulle dans leur état. Alors, veuillez regarder à la fois les réponses et décider si cela compte dans votre situation.