web-dev-qa-db-ja.com

Rubyのerbテンプレートに配列を渡して、それを繰り返し処理するにはどうすればよいですか?

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で物事を試して、そこからそれらを理解する必要があることを知っています。それは私が今読んでいることです。

ありがとう!

15
matt

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

29
nocache

ダミー用のERBテンプレート

基本コード:

_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つの配列すべてのバインディングが返されます(一貫性を保つために、hwaddrnetworkを配列に変更しました。

配列の反復

通常の方法は、次のようにeachメソッドを使用することです。

_<%- devices.each do |d| %>
  auto <%= d %> inet static
<%- end %>
_

ただし、すべてを1行にまとめたい場合は、他の方法もあります。たとえば、_devices.join ' '_は、間にスペースを入れてすべての文字列を結合します。

3
Serabe

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
1