J'ai été un mauvais gamin et j'ai utilisé la syntaxe suivante dans mes modèles partiels pour définir des valeurs par défaut pour les variables locales si une valeur n'était pas explicitement définie dans le: hachage local lors du rendu du partiel -
<% foo = default_value unless (defined? foo) %>
Cela a semblé fonctionner correctement jusqu'à récemment, quand (pour aucune raison je ne pouvais discerner) les variables non passées ont commencé à se comporter comme si elles avaient été définies à zéro (plutôt qu'indéfinies).
Comme il a été souligné par diverses personnes utiles sur SO, http://api.rubyonrails.org/classes/ActionView/Base.html dit pas à l' utilisation
defined? foo
et au lieu d'utiliser
local_assigns.has_key? :foo
J'essaie de modifier mes manières, mais cela signifie changer beaucoup de modèles.
Puis-je / devrais-je simplement charger à l'avance et effectuer cette modification dans tous les modèles? Y a-t-il une astuce que je dois surveiller? Avec quelle diligence dois-je tester chacun d'eux?
la source
local_assigns.fetch
gère parfaitement les touches paires avec une valeur nulle. Il renvoie une valeur par défaut uniquement si la clé n'est pas définie du tout.Étant donné qu'il
local_assigns
s'agit d'un hachage, vous pouvez également utiliser la récupération avec l'optiondefault_value
.Cela reviendra
default_value
s'ilfoo
n'a pas été défini.AVERTISSEMENT:
Faites attention à
local_assigns.fetch :foo, default_value
quanddefault_value
est une méthode, car elle sera appelée de toute façon afin de transmettre son résultat àfetch
.Si votre
default_value
est une méthode, vous pouvez l'encapsuler dans un bloc:local_assigns.fetch(:foo) { default_value }
pour empêcher son appel quand il n'est pas nécessaire.la source
nil
valeurs sont conservées ici. Si le hachage contient:foo
mappé surnil
,fetch
il reviendranil
. C'est, au moins sur ma v1.9.3. Je ne me souviens pas comment 1.8 s'est comporté.local_assigns[:foo] || default_value
, lorsque foo renvoie une valeur falsifiée, ledefault_value
sera utilisé à la place. C'est généralement un problème pour la mémorisation@some_value ||= expensive_method
si la méthode retourne une valeur fausse, elle sera toujours exécutée.foo ||= local_assigns[:foo] = local_assigns.fetch(:foo, default_value)
foo = local_assigns.fetch :foo, true
Que diriez-vous
Cela dit "utiliser
foo
si ce n'est pas nul ou vrai. Sinon, attribuerdefault_value
à foo"la source
foo
s'agit d'un booléen. Il peut légitimement avoir la valeur defalse
et être remplacé pardefault_value
accident.Je pense que cela devrait être répété ici (à partir de http://api.rubyonrails.org/classes/ActionView/Base.html ):
Si vous devez savoir si une certaine variable locale a reçu une valeur dans un appel de rendu particulier, vous devez utiliser le modèle suivant:
Test en utilisant défini? le titre ne fonctionnera pas. Il s'agit d'une restriction d'implémentation.
la source
Dans mon cas, j'utilise:
dans mon partiel.
Je ne sais pas si c'est bien mais pour moi ça va
la source
nil
tant que local dans l'appel partiel également.variable
s'agit d'un booléen et vous devez le régler surfalse
. Il utilisera la valeur par défaut au lieu d'utiliser lafalse
valeur. À UTILISER À VOS RISQUES ET PÉRILS.Je sais que c'est un vieux fil mais voici ma petite contribution: je l'utiliserais
local_assigns[:foo].presence
au conditionnel à l'intérieur du partiel. Ensuite, jefoo
ne définis que lorsque cela est nécessaire dans l'appel de rendu:Consultez le guide officiel de Rails ici . Valable à partir de RoR 3.1.0.
la source
local_assigns[:foo]
etlocal_assigns[:foo].presence
. Soit on retourneranil
si la clé n'existe pas dans le hachage et la valeur si elle existe.Je pense qu'une meilleure option qui permet de multiples variables par défaut:
la source
Ceci est un dérivé de la réponse de Pablo. Cela me permet de définir une valeur par défaut («complet»), et à la fin, «mode» est défini à la fois dans local_assigns et dans une variable locale réelle.
haml / slim:
erb:
la source
Plus intuitif et compact:
<% some_local = default_value unless local_assigns[:some_local] %>
la source
:locals => {:some_local => false}
Si vous ne voulez pas passer de variable locale à partielle à chaque appel, procédez comme suit:
De cette façon, vous évitez les
undefined variable
erreurs. Cela vous permettra d'appeler votre partiel avec / sans variables locales.la source
Ruby 2.5
Erb
C'est possible, mais vous devez déclarer vos valeurs par défaut dans la portée.
VARIABLE le mot à remplacer.
la source
Un assistant peut être créé pour ressembler à ceci:
Mis en œuvre comme:
Voir mon blog pour plus de détails sur comment et pourquoi.
Notez que cette solution vous permet de passer nil ou faux comme valeur sans qu'elle soit remplacée.
la source