template - erb ruby
Compruebe si una variable es undef en la plantilla de tÃtere (3)
El primero debería funcionar a la perfección, es lo que también se enseña en los cursos.
El número dos parece ... redundante.
¿Cuál es la forma correcta de verificar si una variable es undef en una plantilla de títere?
En el manifiesto la variable se define como sigue
$myvar = undef
¿Cómo se verifica esto en la plantilla?
Se vieron las siguientes dos variantes.
<% if @myvar -%>
<% end -%>
y
<% if not @myvar.nil? and @myvar -%>
<% end -%>
Ambos parecen funcionar en mi caso, pero me pregunto si el primer enfoque falla en ciertos casos.
La documentación de Puppet (en el momento de escribir esta respuesta) lo explica muy bien: https://puppet.com/docs/puppet/latest/lang_template_erb.html#concept-5365
Dado que undef
no es lo mismo que false
, solo usar un if
no es una buena manera de verificarlo. También cuando se define una variable, pero tiene un valor de false
o nil
, también es imposible verificar con un simple if
.
Esta es la razón por la que desea usar scope.lookupvar(''variable'')
y verificar su valor de retorno para :undef
o :undefined
(o nil
) para saber si se estableció en undef
, o nunca se estableció en absoluto.
Yo diría que la verificación depende de si desea una alternativa cuando la variable no está definida.
Estoy usando las siguientes reglas:
Variable requerida
Verifique en su script de títere si la variable contiene el valor esperado antes de siquiera considerar la representación de la plantilla:
if $myvar == undef {
fail {"You really must set myvar, seriously."}
}
if ! $anothervar {
fail {"anothervar is false, undefined or empty."}
}
Puede hacer su vida más fácil configurando explícitamente el tipo de parámetros. Esto le ahorra a usted las comparaciones y conversiones.
En su plantilla simplemente escriba las variables y luego:
<%= @myvar %>
<%= @anothervar %>
Variable opcional que debe ser definida
Si asume que la variable está definida, puede tratarla como booleana.
El mapeo es el siguiente ( source ):
- falsey : cadena vacía, false, undef
- verdad : todo lo demas
En Títere> = 4:
- falsey : falso, undef
- verdad : todo lo demas
Ejemplos:
imprime ''algo'' si @myvar se evalúa como verdadero, de lo contrario, ''algo más''.
<% if @myvar %>something<% else %>something else<% end %>
imprime ''algo'' si @myvar se evalúa como verdadero
<% if @myvar %>something<% end %>
print @myvar si se evalúa como verdadero, de lo contrario ''%'' alternativo>
<%= @myvar ? @myvar : ''alternative'' %>
Variable opcional que se puede definir.
Si no está seguro de que una variable esté incluso definida y no quiera hacer suposiciones erróneas, verifíquela en la plantilla.
Ejemplos:
imprima ''algo'' seguido de @myvar si @myvar está definido y no está vacío
<% if defined?(@myvar) && ! @myvar.empty? %>something<%= @myvar %><% end %>
imprime @ myvar si está definido y es mayor que 10
<%= @myvar if defined?(@myvar) && @myvar > 10 %>