2016-05-31 2 views
0

Я начинаю развиваться в марионетке (ruby), и у меня есть следующая проблема.Кукольный. Итерация над вложенным хешем в ERB

У меня есть текущий хеш, который я хочу итерировать в файле шаблона.

$database_profile_hash = 
{ 
    cpu => { 
    governor => ondemand 
    energy_perf_bias => powersave 
    } 
    sysctl => { 
    kernel.sched.min.granularity.ns => 10000000 
    kernel.sched.wakeup.granularity.ns => 15000000 
    kernel.msgmnb => 6 
    } 
    ... 
} 

И мой текущий шаблон выглядит следующим образом:

<% @database_profile_array.each do |arrayValue| %> 
[<%= arrayValue %>] 
<% database_profile_hash[arrayValue].each do |key,value| %> 
<%= key %> <%= value %> 
<% end %> 
<% end %> 

Для перебора массива я пытаюсь использовать массив для хранения всех первых имен уровня, а затем использовать его для перебора хэша:

$ database_profile_array = [процессор, Sysctl ...]

Но я не могу заставить его работать, и я ищу для выхода, как это:

[cpu] 
governor=ondemand 
energy_perf_bias=powersave 

[sysctl] 
vm.laptop_mode=5 
vm.dirty_writeback_centisecs=1500 
kernel.nmi_watchdog=0 

Что я делаю неправильно в шаблоне? Есть способ передать содержимое переменной "arrayValue", чтобы перебрать хэш?

Большое спасибо заранее ...

ответ

7

Ваш шаблон выглядит хорошо, по большей части, но несколько вещей здесь. Во-первых, вы не можете быть в состоянии использовать периоды для имен переменных, но что более важно, не забудьте запятые для разделения пар ключ/значение:

$database_profile_array = [cpu,sysctl] 
$database_profile_hash = 
{ 
    cpu => { 
    governor => ondemand, 
    energy_perf_bias => powersave, 
    }, 
    sysctl => { 
    kernel_sched_min_granularity_ns => 10000000, 
    kernel_sched_wakeup_granularity_ns => 15000000, 
    kernel_msgmnb => 6, 
    } 
} 

В шаблоне, вы забываете равные знаки , и вы также можете опустить символы новой строки для каждой итерации с помощью -%>:

<% @database_profile_array.each do |arrayValue| -%> 
[<%= arrayValue %>] 
<% database_profile_hash[arrayValue].each do |key,value| -%> 
<%= key %>=<%= value %> 
<% end %> 
<% end -%> 

 

Edit: OP, обратите внимание на комментарии других оставивших. Если последовательность итераций не имеет значения, вам не нужен отдельный массив $database_profile_array ссылаться на ключах, а вы можете перебирать хэш непосредственно:

<% @database_profile_hash.each do |key, hash| -%> 
[<%= key %>] 
<% hash.each do |key,value| -%> 
<%= key %>=<%= value %> 
<% end %> 
<% end -%> 

Кроме того, -%> эрба кукольной облицовки тега документированы here.

+1

Обратите также внимание на то, что вам необязательно нужен отдельный массив ключей верхнего уровня. Вы можете повторить хэш верхнего уровня, чтобы получить эти ключи и связанные с ними хэши (значения). Отдельный массив полезен, только если вы хотите указать точную последовательность, в которой представлены разделы, или если вы хотите выбрать внешнее подмножество ключей верхнего уровня. –

+1

RE ответ: вы можете захотеть упомянуть '-%>' потому, что режим обрезки Puppet ERB - '-'. RE комментарий: он также может автоматически сгенерировать этот массив с помощью 'keys' из' puppetlabs-stdlib'. –

+0

@JohnBollinger Очень хороший момент, отредактировал мой ответ, чтобы включить ваш отзыв. Благодаря! – drewyupdrew

Смежные вопросы