中间人:从FrontMatter中的数据文件中选择信息



我正在使用Middleman静态页面生成器,我想根据FrontMatter在FrontMatter中进行的选择从数据文件中获取信息。

示例

我的数据文件位于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中,然后能够从test.html.erb FrontMatter中的cta.yaml中"选择"信息。

我试图更改

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

layout.erb to

<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数据文件中进行的"这是默认的CTA"。

问题

是否有可能使用FrontMatter选择给定页面的数据文件中的哪些文本?

正如我在评论中提到的那样,前桅杆是在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使用的助手,因此输出为:

这里特别的东西

最新更新