Шаблон 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."