中间人:在frontmatter中从数据文件中选择信息

Middleman: choosing information from data files in frontmatter

我正在使用 Middleman 静态页面生成器,我想从基于 frontmatter 制作的 selection 的数据文件中提取信息。

例子

我的数据文件位于 data/cta.yaml,其中包含可以在不同页面上重复的不同变体的号召性用语文本,这意味着每个 CTA 文本可以在多个页面上使用。

data/cta.yaml:

basic: This is default CTA
special: Something special here
other: Some other CTA

然后我有 layout.erb:

<body>
<%= yield %>
<p class="cta">No data yet</p>
</body>

test.html.erb

---
title: Some page for testing
cta: It works with layout if I do not reference 'data/cta.yaml'
---

Some page content.

如果我想使用,比方说,第一个 CTA 文本,我可以在 layout.erb 布局文件中使用 <p class="cta"><%= data.cta.basic %></p>,或者将其从布局中删除并直接移动到 test.html.erb 模板文件。或者,我可以完全删除数据文件,只需在 frontmatter 中为每个页面键入 CTA 文本。但是,我更愿意将 CTA 文本保留在数据文件中,并将所有 HTML 保留在 layout.erb 中,然后能够从 cta.yaml 中的 "choose" 信息放在 test.html.erb 前言中。

我试图改变

<p class="cta"><%= data.cta.basic %></p>

layout.erb

<p class="cta"><%= current_page.data.cta %></p>

然后在 test.html.erb 前言中:

---
title: Some page for testing
cta: data.cta.basic
---

但这导致逐字 data.cta.basic 文本而不是 cta.yaml 数据文件中的 "This is default CTA"。

问题

是否可以使用 frontmatter select 给定页面应使用数据文件中的哪个文本?

正如我在评论中提到的,前文在 ERB 之前被解析,这就是您看到 data.cta.basic 而不是正确的 cta 的原因。

虽然您可以添加一个助手来实现这一点。

这是我的帮手

module CtaHelpers
  def page_cta
    cta = current_page.data.cta
    data.cta.send(cta)
  end
end

这是我的 test.html.erb 文件:

---
cta: special
---
<p class="cta"><%= page_cta %></p>

test.html.erb 文件正在调用从 Frontmatter 确定要使用哪个 CTA 的帮助程序,因此输出为:

Something special here