在 Ruby 部分内重复调用

Repeat calls inside Ruby partial

我是 Ruby 的新手,所以这可能很简单。我有一个部分,我想从根本上填充一个列表。

这是我的部分 (.erb) 代码:

<ul>
  <% if locals.has_key? :sermon_commentary %>
    <li><i class="material-icons">link</i><a href="<%= sermon_commentary %>">Matthew Henry's Commentary on <%= sermon_passage %></a></li>
  <% end %>
  <% if locals.has_key? :sermon_passage_lookup %>
    <li><i class="material-icons">link</i><a href="<%= sermon_passage_lookup %>"><%= sermon_passage %> on Bible Gateway</a></li>
  <% end %>
  <% if locals.has_key? :sermon_audio_download %>
    <li><i class="material-icons">music_note</i><a href="/audio/<%= sermon_audio_download %>" download="/audio/<%= sermon_audio_download %>">Download this sermon (MP3 ~5mb)</a></li>
  <% end %>
</ul>

下面是我在 .html.erb 文件中的调用方式:

  :sermon_commentary => "https://www.biblegateway.com/resources/matthew-henry/Luke",
  :sermon_passage_lookup => "https://www.biblegateway.com/passage/?search=Luke+4%3A14-21&version=NIV",
  :sermon_audio_download => "FUSE_7th_August.mp3",
  :sermon_video => "https://www.youtube-nocookie.com/embed/VzOYe8nUCS4?rel=0&amp;showinfo=0"

但是对于上面的当前代码,如果我想要 多个 列表项(例如,第二个 'sermon_passage_lookup' 列表项,它不起作用。

如有任何帮助,我们将不胜感激。我想我需要一个

[something].each do |something|

但我不确定如何构建它。谢谢:)

编辑:实施 Taryn 的修复

Taryn,感谢你迄今为止的所有帮助。我现在看到了散列和数组之间的明显区别。我已经按照您的建议设置了部分模板:

<ul>
  <% if locals.has_key? :sermon_links %>
    <% sermon_links.each do |link| %>
      <li>
        <i class="material-icon‌​s"><%= link[:icon] %></i>
        <a href="<%= link[:hyperlink] %>"><%= link[:link_label] %></a>
      </li>
    <% end %>
  <% end %>
</ul>

我是这样使用它的:

:sermon_links => [
   { :icon => "link", :hyperlink => "http://www.facebook.com/", :link_label => "Testing" },
   { :icon => "link", :hyperlink => "http://google.com/", :link_label => "Testing2" }
 ]

很遗憾,我遇到了错误。看起来 'link' 散列没有被识别?这是 Chrome 抛给我的东西:

NameError at /resources/sermons/the-fifth-act/fuse-14-08-16.html undefined local variable or method 'icon' for #<Middleman::Application:0x70168621815860>

如果您确保将 sermon_passage_lookups 作为数组传入(即使只有一项),那么您可以像提到的那样调用它们,例如:

<% if locals.has_key? :sermon_passage_lookups %>
  <% sermon_passage_lookups.each do |sermon_passage_lookup| %>
    <li><i class="material-icons">link</i><a href="<%= sermon_passage_lookup %>"><%= sermon_passage %> on Bible Gateway</a></li>
  <% end %>
<% end %>

编辑

下面评论中给出的示例的变体:

首先是主 .erb 模板:我认为您不需要多余的单词 :link -> 只需将每个 link-set 放入主数组即可。此外,您不需要 link-hash 周围的额外数组,例如,您只需要:

:sermon_links => [
   { :icon => "link", :hyperlink => "http://www.facebook‌​.com/", :link_label => "Testing" },
   {:icon => "link2", :hyperlink => "http://google.com/", :link_label => "Testing2"} ]

即仅包含您需要的数据,不包含您不需要的数据。

这是一个散列,键为sermon_links是一个数组。 该数组包含散列 - 每个散列对应于您需要列出的 link-数据。

然后,您的部分模板将需要从 sermon_links 数组访问这些哈希值。您在评论中的示例将散列值视为变量名(例如 <%= icon %>),但这不会起作用...唯一的变量名为 sermon_links 然后您使用each 将每个值转换为您命名为 link 的单个散列,因此您需要引用 link 作为散列以从中获取图标...像这样:

<ul>
  <% if locals.has_key? :sermon_links %>
    <!-- at this point we have the full `sermon_links` -->
    <% sermon_links.each do |link| %>
      <!-- now we have a single `link` from the set eg
         - { :icon => "link",
             :hyperlink => "http://www.facebook‌​.com/",
             :link_label => "Testing" } -->
      <li>
        <i class="material-icon‌​s"><%= link[:icon] %></i>
        <a href="<%= link[:hyperlink] %>"><%= link[:link_label] %></a>
      </li>
    <% end %>
  <% end %>
</ul>