Как передать массив в шаблон 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