2017-05-22 3 views
0

私は以下のデータとerbテンプレートを持っています。サービスをポート番号とサービスの配列にハッシュマッピングします。ERBテンプレートのネストされた変数 - 配列要素に基づくハッシュキーへのアクセス

各サービスごとに配列を繰り返し処理し、現在処理中のサービスのポート番号を取得するためにハッシュにアクセスする必要があります。変数を入れ子にするのは、私が以下のようにしているようには思われません。より良い方法がありますか?

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 %> 

最も単純な例で私は自分のコードを実行しようと、私は次のエラーを取得するERBテンプレート

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

を持っている:

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

をしかし、それは '<% - サービス%>であります''( '' max_logger ') 'または' 'service ==' max_logger''のように、' @ ports'と 'ports'とは異なっていますか? –

+0

<%= service%>は正しい方法です - 間違いでした。 max_loggerが処理されているかどうかを調べるためのincludeステートメントは正しいです。 @portsについての私の理解は、erbに渡される外部定義の変数にアクセスするために@が必要なことです。そのため、erbテンプレート内で定義されているサービスのために、このサービスは必要ありません。 –

+0

配列内の 'max_logger'値の存在をチェックすると、反復するすべての値は' 00'を出力しませんが、 'service == 'max_logger 'それで '@ service'に複数の' 'max_logger''があれば、それは一回だけです。 –

答えて

2

私は、彼らが動作しません最近実現名前が一致しない場合(配列値、ハッシュキー):

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

彼らは@servicesから-および/または_で異なります

%w(max_api max_data max_logger) 

だけビット@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 
関連する問題