web-dev-qa-db-ja.com

人形と配列ループ

こんにちはパペットのerbでこれをコーディングする方法についていくつかの助けが欲しい、基本的に私は

server::actionhost { 'details':
    servername[ 'felix', 'washington', ],
    ipa [ '192.168.43.5', '192.168.43.11', ],
    enviro [ 'prod', 'uat', ],
}

これを、各配列の各要素を1行に含むファイルに出力します。つまり、クラスのテンプレートファイルからの出力は次のようになります。

felix 192.168.43.5 prod
washington 192.168.43.11 uat

私がこれを試みたとき、私は私のテンプレートファイルに次のコードを書きました:

<% servername.each do |name| -%>
    <% ipa.each do |ip| -%>
        <% enviro.each do |env| -%>
            <%= name %> <%= ip %> <%= env %>
        <% end -%>
    <% end -%>
<% end -%>

しかし、私が得るのは、各配列からの印刷ではなく、複数の再帰的な印刷であり、次の配列要素に移動します。

Forループを考えていますが、forループの引数として配列の長さを取得する方法がわかりません。正しい出力を実現する方法に関するガイダンスを教えていただけますか?

私はこのようなことを試みましたが、パペットの実行でエラーが発生して失敗しますか?

<% for id in servername.length %>
    <%= servername[id] %> <%= ipa[id] %> <%= enviro[id] %>
<% end -%>

ありがとうダン

6
Dan

そのデータ構造を使用する必要がある特別な理由はありますか?これはすぐに判読できなくなり、誤って配列の1つに要素を追加したり、他の要素に要素を削除したりすることにより、非常に簡単に破壊されます。代わりにこのようなものはどうですか?

$servers = [
  {
    name => 'felix',
    ip   => '192.168.43.5',
    env  => 'prod',
  },
  {
    name => 'washington',
    ip   => '192.168.43.11',
    env  => 'uat',
  },
]

次に、erbで作業する方がはるかに簡単です。

<% servers.each do |server| -%>
  <%= server['name'] %> <%= server['ip'] %> <%= server['env'] %>
<% end -%>

しかし、現在のデータ構造で立ち往生している場合は、これで十分です。

<% (1..servername.length).each do |i| -%>
12
Shane Madden

シェーンマッデンの答えは素晴らしいですが、「@」がないと思います:

の代わりに

<% servers.each do |server| -%>

人は使うべきです

<% @servers.each do |server| -%>

評判の高い人が元の回答にコメントしたり、私の回答を削除したりできるようにしてください。

パペットクックブック第3版 でも説明されています。

ありがとう、マット

1
Matt V