Erbテンプレートについてサポートが必要です。配列を渡して、それを反復処理することに頭を悩ませているようには見えません。私の問題はこれです。いくつかの配列を渡したい: `
device => ["eth0", "br0"],
ipaddr => ["192.168.12.166", "192.168.12.199"],
netmask => ["255.255.255.0", "255.255.255.0"],
hwaddr => '',
network => '',
gateway => ["192.168.12.254", "192.168.12.204"],
配列内の各アイテムを反復処理して出力するテンプレートの場合:
auto <%= device %> inet static
address <%= ipaddr %>
netmask <%= netmask %>
broadcast <%= broadcast %>
gateway <%= gateway %>
私がこれまでに知る限り、device.each |device| puts device
で何かをする必要があることを理解していますが、構文がどのようになっているのかわかりません。これらのスニペットから私が何をしようとしているのかがわかると思います。そうすれば、エントリを補間するのではなく、分離する必要があることを理解できるかもしれません。あなたが提供できるどんな助けもいただければ幸いです。私はirbで物事を試して、そこからそれらを理解する必要があることを知っています。それは私が今読んでいることです。
ありがとう!
Rubyでそれぞれを使用するための基本的な構文は次のようなものです:
array.each do |item_from_array| BLOCK
したがって、配列が1つしかない場合は、次のようにすることができます:(わかりやすくするために垂直バー内で別の名前を使用します)
<% device.each do |dev| %>
auto <%= dev %> inet static
<% end %>
ただし、ipaddr配列に移動する前に、最初にすべてのデバイスを反復処理します。それぞれ順番に自動、アドレス、ネットマスクなどが必要だと思います。その場合は、次のように、より「従来の」インデックスを使用してN回ループする方がよいでしょう。
<% for idx in (0..1) %>
auto <%= device[idx] %> inet static
address <%= address[idx] %>
netmask <%= netmask[idx] %>
broadcast <%= broadcast[idx] %>
<% end %>
もちろん、配列の最大サイズと、配列に含まれるエントリが他の配列より少ない場合の対処方法について考える必要があります。次のようにすると、すべての配列の最大サイズを見つけることができます。[device,address,netmask,broadcast].map{|a| a.length}.max
次のように特定の配列をスキップできます:<% if idx < address.length %> address <%= address[idx] %><% end %>
基本コード:
_require 'erb'
ERB.new(template).result binding_for_template
_
template
と_binding_for_template
_とは何ですか?
テンプレートコンテンツのみ。 File.read(path)
だけでファイルから読み取ることができます。
A バインディング
コード内の特定の場所で実行コンテキストをカプセル化し、将来の使用のためにこのコンテキストを保持します。
どうやって使うんですか?簡単:
_def binding_for_my_template
devices = ["eth0", "br0"]
ipaddrs = ["192.168.12.166", "192.168.12.199"]
netmasks = ["255.255.255.0", "255.255.255.0"]
hwaddrs = ['']
networks = ['']
gateways = ["192.168.12.254", "192.168.12.204"]
binding
end
_
これにより、6つの配列すべてのバインディングが返されます(一貫性を保つために、hwaddr
とnetwork
を配列に変更しました。
通常の方法は、次のようにeach
メソッドを使用することです。
_<%- devices.each do |d| %>
auto <%= d %> inet static
<%- end %>
_
ただし、すべてを1行にまとめたい場合は、他の方法もあります。たとえば、_devices.join ' '
_は、間にスペースを入れてすべての文字列を結合します。
docs を読む必要があります。引用:
# Managed by Class['ntp']
<% servers_real.each do |server| -%>
server <%= server %>
<% end -%>
# ...
このスニペットは、配列内の各エントリを反復処理し、サーバーステートメントの後に出力するため、たとえば、Debianテンプレートから生成された文字列は、次のようなブロックになります。
# Managed by Class['ntp']
server 0.debian.pool.ntp.org iburst
server 1.debian.pool.ntp.org iburst
server 2.debian.pool.ntp.org iburst
server 3.debian.pool.ntp.org iburst