2016-05-31 18 views
0

Ich fange an, in Marionette (Rubin) zu entwickeln, und ich habe das folgende Problem.Marionette. Iterate über einen verschachtelten Hash in ERB

Ich habe den aktuellen Hash, den ich in einer Vorlagendatei iterieren möchte.

$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 
    } 
    ... 
} 

Und meine aktuelle Vorlage ist die folgende:

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

das Array iterieren ich ein Array zu verwenden, ich versuche, alle Namen der ersten Ebene zu speichern und dann den Hash iterieren verwenden:

$ database_profile_array = [cpu, sysctl, ...]

Aber ich bin nicht in der Lage, damit es funktioniert und ich bin auf der Suche nach einem Ausgang wie folgt aus:

[cpu] 
governor=ondemand 
energy_perf_bias=powersave 

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

Was mache ich falsch in der Vorlage? Es gibt eine Möglichkeit, den Inhalt der Variablen "arrayValue" an den Hash zu übergeben.

Vielen Dank im Voraus ...

Antwort

7

Ihre Vorlage zum größten Teil gut aussieht, aber nur wenige Dinge hier. First off, können Sie nicht in der Lage sein, Zeiten für Ihre Variablennamen zu verwenden, aber noch wichtiger ist, keine Kommas zu trennen Schlüssel/Wert-Paare vergessen:

$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, 
    } 
} 

in Ihrer Vorlage sind Sie die Gleichheitszeichen zu vergessen , und Sie können auch durch die Verwendung -%> für jede Iteration neue Zeile Zeichen auslassen möchten:

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

 

Edit: OP, beachten Sie die Kommentare anderer verlassen haben. Wenn die Iterationsfolge spielt keine Rolle, brauchen Sie nicht die separate Anordnung $database_profile_array die Schlüssel zu verweisen, vielmehr können Sie den Hash direkt iterieren:

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

Auch die -%> erb Puppen Trimm-Tag wird here dokumentiert.

+1

Beachten Sie auch, dass Sie nicht unbedingt ein separates Array der Top-Level-Schlüssel benötigen. Sie können den Hash der obersten Ebene durchlaufen, um diese Schlüssel und die zugehörigen Hashwerte (Werte) abzurufen. Das separate Array ist nur dann nützlich, wenn Sie die genaue Reihenfolge angeben möchten, in der die Abschnitte angezeigt werden, oder wenn Sie eine extern gerichtete Teilmenge der Schlüssel der obersten Ebene auswählen möchten. –

+1

RE Antwort: Sie können erwähnen, '-%>' ist, weil Puppet ERB Trimmmodus '-' ist. RE-Kommentar: Er kann dieses Array auch automatisch mit 'keys' aus' puppetlabs-stdlib' erzeugen. –

+0

@JohnBollinger Sehr guter Punkt, bearbeitete meine Antwort mit Ihrem Tipp. Vielen Dank! – drewyupdrew