Проверьте, является ли переменная undef в кукольном шаблоне
Каков правильный способ проверить, является ли переменная undef в марионеточном шаблоне?
В манифесте переменная определяется следующим образом
$myvar = undef
Как это проверяется в шаблоне?
Я видел следующие два варианта:
<% if @myvar -%>
<% end -%>
а также
<% if not @myvar.nil? and @myvar -%>
<% end -%>
Они оба, похоже, работают в моем случае, но мне интересно, не срабатывает ли первый подход в определенных случаях?
Ответы
Ответ 1
Документация Puppet (на момент написания этого ответа) объясняет это очень хорошо: https://puppet.com/docs/puppet/latest/lang_template_erb.html#concept-5365
Поскольку undef
- это не то же самое, что false
, просто использование if
не является хорошим способом проверить это. Также, когда переменная определена, но имеет значение false
или nil
это также невозможно проверить с помощью простого if
.
Вот почему вы хотите использовать scope.lookupvar('variable)
и проверить его возвращаемое значение для :undef
или :undefined
(или nil
), чтобы узнать, было ли оно установлено в undef
или никогда не задано вообще.
Ответ 2
Я бы сказал, что проверка зависит от того, хотите ли вы альтернативу, когда переменная не определена.
Я использую следующие правила:
Требуемая переменная
Проверьте свой марионетный скрипт, будет ли переменная содержать ожидаемое значение до того, как даже рассмотрит рендеринг шаблона:
if $myvar == undef {
fail {"You really must set myvar, seriously."}
}
if ! $anothervar {
fail {"anothervar is false, undefined or empty."}
}
Вы можете сделать свою жизнь проще, задав тип параметров явно. Это избавляет вас от сравнения и преобразования.
В шаблоне вы просто записываете переменные:
<%= @myvar %>
<%= @anothervar %>
Необязательная переменная, которая должна быть определена
Если вы предполагаете, что переменная определена, вы можете рассматривать ее как логическую.
Отображение выглядит следующим образом (источник):
- falsey: пустая строка, false, undef
- правдивость: все остальное
В Puppet> = 4:
- false: false, undef
- правдивость: все остальное
Примеры:
напечатайте "что-то", если @myvar оценивает значение true, иначе "что-то еще".
<% if @myvar %>something<% else %>something else<% end %>
print 'something', если @myvar оценивает true
<% if @myvar %>something<% end %>
print @myvar, если он оценивает значение true, иначе 'alternative'%>
<%= @myvar ? @myvar : 'alternative' %>
Необязательная переменная, которая может быть определена
Если вы не уверены, что переменная определена и не хотят делать неправильные предположения, проверьте ее в шаблоне.
Примеры:
напечатайте "что-то", за которым следует @myvar, если @myvar определен и не пуст
<% if defined?(@myvar) && ! @myvar.empty? %>something<%= @myvar %><% end %>
print @myvar, если он определен и больше 10
<%= @myvar if defined?(@myvar) && @myvar > 10 %>
Ответ 3
Первый должен работать как шарм, это то, чему учат и на курсах.
Номер два кажется... лишним.