Как передать массив в шаблон erb в ruby ​​и повторить его? - PullRequest
15 голосов
/ 16 августа 2011

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

Спасибо!

Ответы [ 3 ]

29 голосов
/ 16 августа 2011

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

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

3 голосов
/ 16 августа 2011

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

Базовый код:

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

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

Шаблон

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

Binding для шаблона

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 ' ' объединит все строки с помощьюпространство между ними.

1 голос
/ 16 августа 2011

Вы должны прочитать документы . Цитирование:

# 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
...