簡體   English   中英

如何將數組傳遞給 ruby 中的 erb 模板並對其進行迭代?

[英]How do you pass an array to an erb template in ruby and have it iterated over?

我需要一些有關 erb 模板的幫助,我似乎無法理解傳遞一個數組然后對其進行迭代。 我的問題是這個。 我想通過幾個arrays:`

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做一些事情。 device.each |device| puts device ,但我不知道語法應該是什么樣子。 我相信你可以從這些片段中看出我想要做什么,然后你可能會明白這些條目需要分開,而不是插值。 您可以提供的任何幫助將不勝感激。 我知道我應該在 irb 中嘗試並從那里找出它們,這就是我現在正在閱讀的內容。

謝謝!

在 ruby 中使用 each 的基本語法是這樣的:

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

當然,您需要考慮數組的最大大小是多少,以及如果數組包含的條目比其他數組少,該怎么辦。 您可以通過執行以下操作找到所有 arrays 的最大大小: [device,address,netmask,broadcast].map{|a| a.length}.max [device,address,netmask,broadcast].map{|a| a.length}.max

你可以像這樣跳過一個特定的數組: <% if idx < address.length %> address <%= address[idx] %><% end %>

傻瓜的 ERB 模板

基本代碼:

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

什么是templatebinding_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

這將返回與所有六個 arrays 的綁定(我將hwaddrnetwork更改為 arrays 以保持一致性。

迭代 arrays

通常的方法是使用each方法,就像這樣:

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

但是如果您想將所有內容放在一行中,還有其他方法,例如devices.join ' '將連接所有字符串,其間有空格。

您應該閱讀文檔 報價:

# 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM