如何将数组传递给ruby中的erb模板并将其迭代?

mat*_*att 15 ruby templates puppet

我需要一些关于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"],                                                                                                                
Run Code Online (Sandbox Code Playgroud)

对于迭代数组中每个项目并将其打印出来的模板:

auto <%= device %> inet static                                                                                                                                        
address <%= ipaddr %>
netmask <%= netmask %>
broadcast <%= broadcast %>
gateway <%= gateway %>
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经知道我需要做些什么device.each |device| puts device,但我不知道语法应该是什么样子.我相信你可以从这些片段中分辨出我想要做什么,然后你可能会理解这些条目需要分开,而不是插入.您可以提供的任何帮助将不胜感激.我知道我应该用irb来解决问题并从那里搞清楚,这就是我现在正在阅读的内容.

谢谢!

noc*_*che 30

在ruby中使用每个的基本语法是这样的:

array.each do |item_from_array| BLOCK
Run Code Online (Sandbox Code Playgroud)

所以如果你只有一个数组那么你可以做这样的事情:(为了清楚起见,我会在竖条内使用不同的名字)

<% device.each do |dev| %>
  auto <%= dev %> inet static
<% end %>
Run Code Online (Sandbox Code Playgroud)

然而,在继续使用ipaddr阵列之前,这将首先遍历所有设备.我猜你想要他们每个轮流自动,地址,网络掩码等.在这种情况下,你最好使用更"传统"的索引并循环N次,如下所示:

<% for idx in (0..1) %>
  auto <%= device[idx] %> inet static
  address <%= address[idx] %>
  netmask <%= netmask[idx] %>
  broadcast <%= broadcast[idx] %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

当然,您需要考虑数组的最大大小,以及如果数组包含的条目少于其他数组,该怎么办.您可以通过执行以下操作找到所有阵列的最大大小:[device,address,netmask,broadcast].map{|a| a.length}.max

你可以跳过这样的特定数组: <% if idx < address.length %> address <%= address[idx] %><% end %>


Ser*_*abe 5

ERB 傻瓜模板

基本代码:

require 'erb'
ERB.new(template).result binding_for_template
Run Code Online (Sandbox Code Playgroud)

template和是什么binding_for_template

模板

只是模板内容。您只需从文件中读取它即可File.read(path)

模板绑定

一个绑定

将执行上下文封装在代码中的某个特定位置,并保留该上下文以供将来使用。

你如何使用它?简单的:

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
Run Code Online (Sandbox Code Playgroud)

这将返回与所有六个数组的绑定(为了保持一致性,我将hwaddr和更改network为数组。

迭代数组

通常的方法是使用该each方法,就像这样:

<%- devices.each do |d| %>
  auto <%= d %> inet static
<%- end %>
Run Code Online (Sandbox Code Playgroud)

但是如果您想将所有内容放在一行中,还有其他方法,例如devices.join ' '将所有字符串连接起来,中间用空格连接。