Шаблон Chef erubis: Формат вывода на основе классов значений

В моей поваренной книге Chef (для почтальона) я хочу использовать атрибут, который является хешем и содержит все параметры конфигурации, которые я хочу записать в шаблон (аналогично тому, как это делается в поваренной книге chef-client).

Поэтому я хочу иметь в моих атрибутах:

default[:myapp][:config] = {
  "I_AM_A_STRING" => "fooo",
  "I_AM_AN_INT" => 123,
  "I_AM_AN_ARRAY" => ["abc", "cde"]
}

В качестве вывода я хочу следующее (совместимый с почтальоном):

I_AM_A_STRING = 'fooo'
I_AM_AN_INT = 123
I_AM_AN_ARRAY = ['abc', 'cde']

Однако это не работает.

Чтобы устранить проблему, у меня есть следующий код в моем шаблоне erubis:

<% node[:myapp][:config].each_pair do |key, value| -%>
  <% case value.class %>
  <% when Chef::Node::ImmutableArray %>
# <%= key %> is type <%= value.class %>, used when Chef::Node::ImmutableArray
<%= key %> = ['<%= value.join("','") %>']
  <% when Fixnum %>
# <%= key %> is type <%= value.class %>, used when Fixnum
<%= key %> = <%= value %> #fixnum
  <% when String %>
# <%= key %> is type <%= value.class %>, used when String
<%= key %> = '<%= value %>' #string
  <% else %>
# <%= key %> is type <%= value.class %>, used else
<%= key %> = '<%= value %>'
  <% end -%>
<% end -%>

Поэтому я хочу использовать case .. when различать value.class, Тем не менее, ни один из when условия совпадают. Итак, вывод:

# I_AM_A_STRING is type String, used else
I_AM_A_STRING = 'fooo'
# I_AM_AN_INT is type Fixnum, used else
I_AM_AN_INT = '123'
# I_AM_AN_ARRAY is type Chef::Node::ImmutableArray, used else
I_AM_AN_ARRAY = '["abc", "cde"]'

Когда я пытаюсь when Whatever.class, первый when спички для всех типов.

Что я делаю неправильно?

1 ответ

Решение

Похоже, вы имеете в виду

   <% case value %>

вместо

  <% case value.class %>

Вот как case..when работает в рубине. Часто бывает так, что вам нужно переключаться на основе значения (или даже диапазона значений), а также типа.

Это позволяет вам делать такие вещи в ruby ​​(и, следовательно, также в erubis/eruby):

def f(x)
  case x
    when String then "#{x} is a String"
    when 42 then "It's #{x==42}, x is 42"
    when 21..27 then "#{x} is in 21..27"
    when Fixnum then "#{x} is numeric, that's all I know"
    else "Can't say."
  end
end

f(1)        # "1 is numeric, that's all I know" 
f(25)       # "25 is in 21..27"  
f("hello")  # "hello is a String"
f(false)    # "Can't say."
Другие вопросы по тегам