поваренная книга: распространить список из узла для заполнения значений шаблона

У меня есть список проверяемых в файле узла в кулинарной книге как

"normal": {
        "Data_list": 'one, two, three, four',
    "tags": [

    ]
}

на основе этого списка я хочу добавить значения в шаблон, ниже приведен источник того же самого, но, похоже, вместо запуска case и if он добавляет всю логику, как в шаблоне, в виде простого текста.

<%= [node['data_list']].each do |data|
     case data
     when 'one'
          "this is one and this will be added in template"
     when 'two'
          "this is two and this will be added in template"
     when 'three'
          "this is three and this will be added in template"
     when 'four'
          "this is four and this will be added in template"
     default
          "this is default and this will be added in template"
     end
end %>

любая помощь в определении того, где я делаю не так, будет очень полезна

2 ответа

Данные JSON для data_list задаются как одна строка, а не как массив. Если я правильно понимаю ваш вопрос, я думаю, вам нужно использовать это в качестве данных JSON:

"normal": {
  "data_list": ["one", "two", "three", "four"],
  "tags": []
}

Когда мы используем caseзаявление, мы обычно выбираем один из вариантов. Путем итерации по массиву вnode['data_list']мы будем соответствовать всем или более чем одному условию.

Однако правильный способ визуализации шаблона с помощью оператора case:

<% node['data_list'].each do |data| %>
  <% case data %>
  <% when 'one' %>
    'this is one and this will be added in template'
  <% when 'two' %>
    'this is two and this will be added in template'
  <% when 'three' %>
    'this is three and this will be added in template'
  <% when 'four' %>
    'this is four and this will be added in template'
  <% else %>
    'this is default and this will be added in template'
  <% end %>
<% end %>

Примечание: из-за итерации любые несоответствующие элементы массива будут печататьelse часть много раз.

Конечно, чтобы это сработало, вам нужно будет определить data_list как массив, как предложил Джефф.

Обновление:

В шаблоне Chef:

  • Чистый текст отображается как есть. Пример:"this is one.." (цитаты включены)
  • Строковая / переменная интерполяция. Пример:<%= node['hostname'] %> отобразит имя хоста
  • Оцените код Ruby. Пример:<% if true %> оценивать if заявление
Другие вопросы по тегам