2017-05-22 1 views
0

Ich habe die folgenden Daten und Erb-Vorlage: ein Hash-Mapping-Dienste zu Port-Nummern und ein Array von Diensten.ERB Vorlage geschachtelte Variable - Zugriff auf einen Hash-Schlüssel basierend auf Array-Element

Ich Iterate über das Array für jeden Dienst und ich muss auf den Hash zugreifen, um die Portnummer für den aktuell verarbeiteten Dienst zu erhalten. Es scheint mir nicht erlaubt zu sein, Variablen so zu nisten, wie ich es unten mache. Gibt es einen besseren Weg?

ports = {"max-api" => 83, "max-logger" => 82, "max-data" => 84} 

services = %w(max_api max_data max_logger) 

    <% @services.each do |service| %> 
     <% if service.include?("max_logger") %> 
     shell: echo <%= service %>:<%= @ports["<%= service %>"] %> 
     <% else %> 
     shell: echo <%= service %>:<%= @ports["<%= service %>"] %>00 
     <% end %> 
    <% end %> 

Einfachstes Beispiel habe ich die erb Vorlage

<% @services.each do |service| %> 
<%= @ports[<%= service %>] %> 
<% end %> 

Wenn ich versuche, meinen Code ich folgende Fehlermeldung erhalten auszuführen:

Chef::Mixin::Template::TemplateError 
------------------------------------ 
(erubis):2: syntax error, unexpected '<', expecting ']' 
_buf << (@ports[<%= service).to_s; _buf << ']... 
       ^
(erubis):2: unterminated string meets end of file 
+0

Leider in einer solchen lästigen Weg zu fragen, aber ist es '<% - Service%> 'oder' <% = service%> '?,' include? ('max_logger') 'oder' service == 'max_logger'', ist es '@ ports' anders als' ports'? –

+0

<% = service%> ist der richtige Weg, - war ein Fehler. Die include-Anweisung zur Überprüfung, ob max_logger verarbeitet wird, ist korrekt. Mein Verständnis mit @ports ist, dass ich @ für den Zugriff auf extern definierte Variablen benötige, die an den Erb übergeben werden. Daher benötigen Sie es nicht für den Service, der in der Erb-Vorlage definiert ist. –

+0

Ich sehe, hilf mir zu verstehen, wenn Sie nach dem Vorhandensein eines 'Max_Logger'-Wertes innerhalb des Arrays suchen, dann wird jeder Wert, den Sie iterieren, nicht' 00 'ausgeben, aber wenn Sie überprüfen, ob dieser 'service ==' max_logger '' dann wird das nur einmal oder öfter sein, wenn es mehr als einen '' max_logger '' in '@ services' gibt. –

Antwort

2

Ich erkannte in letzter Zeit werden sie nicht funktionieren wenn sie nicht im Namen übereinstimmen (Array-Wert, Hash-Schlüssel):

{"max-api" => 83, "max-logger" => 82, "max-data" => 84} 

Sie unterscheiden sich in - und/oder _ von @services:

%w(max_api max_data max_logger) 

nur ein bisschen gezwickt @services:

ports = {'max-api' => 83, 'max-logger' => 82, 'max-data' => 84} 
services = %w(max-api max-data max-logger) 

services.each do |service| 
    puts "shell: echo #{service}:#{ports[service]}#{'00' if service != 'max-logger'}" 
end 
# => shell: echo max-api:8300 
# => shell: echo max-data:8400 
# => shell: echo max-logger:82 
Verwandte Themen