Middleman:从frontmatter中的数据文件中选择信息

时间:2017-04-18 06:26:03

标签: ruby yaml middleman static-pages middleman-4

我正在使用Middleman静态页面生成器,我想根据在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文字,我可以在<p class="cta"><%= data.cta.basic %></p>布局文件中使用layout.erb或将其从布局中移除,并将其直接移至结尾test.html.erb模板文件。或者,我可以完全删除数据文件,只需在frontmatter中为每个页面键入CTA文本。但是,我更希望将CTA文本保存在数据文件和layout.erb中的所有HTML中,然后才能选择&#34;来自cta.yaml前线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文字而不是&#34;这是默认的CTA&#34;来自cta.yaml数据文件。

问题

是否可以使用frontmatter选择数据文件中的哪些文本应该用于给定的页面?

1 个答案:

答案 0 :(得分:1)

正如我在评论中提到的那样,在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,因此输出为:

  

这里特别的东西