Как передать массив в шаблон erb в ruby ​​и повторить его?

Мне нужна помощь с 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 и выдумывать их там, вот что я сейчас читаю.

Спасибо!

Ответы

Ответ 1

базовый синтаксис для использования каждого в рубине выглядит примерно так:

array.each do |item_from_array| BLOCK

поэтому, если у вас был только один массив, вы могли бы просто сделать что-то вроде этого: (Для ясности я использовал бы другое имя внутри вертикальных баров)

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

Ответ 2

Шаблоны ERB для чайников

Базовый код:

require 'erb'
ERB.new(template).result binding_for_template

Что такое template и binding_for_template?

Шаблон

Просто содержимое шаблона. Вы можете прочитать его из файла только с помощью File.read(path).

Связывание для шаблона

A binding

инкапсулировать контекст выполнения в определенном месте в коде и сохранить этот контекст для будущего использования.

Как вы его используете? Легко:

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

Это вернет привязку со всеми шестью массивами (я изменил hwaddr и network на массивы для согласованности.

Итерация по массивам

Обычный способ использует метод each, как это:

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

но есть и другие методы, если вы хотите поместить все в одну строку, например devices.join ' ' присоединяется ко всем строкам с промежутком между ними.

Ответ 3

Вы должны прочитать 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