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

Ruby 中间人:从frontmatter中的数据文件中选择信息,ruby,yaml,middleman,static-pages,middleman-4,Ruby,Yaml,Middleman,Static Pages,Middleman 4,我使用的是Middleman静态页面生成器,我想根据frontmatter中的选择从数据文件中提取信息 实例 我有一个位于data/cta.yaml的数据文件,其中包含不同的行动要求文本变体,可以在不同的页面上重复,这意味着每个cta文本可以在多个页面上使用 数据/cta.yaml: 然后是layout.erb: 如果我想使用,比如说,第一个CTA文本,我可以在layout.erb布局文件中使用,或者将其从布局中删除,并将其直接移动到test.html.erb模板文件的末尾。或者,我可以完全删除

我使用的是Middleman静态页面生成器,我想根据frontmatter中的选择从数据文件中提取信息

实例 我有一个位于data/cta.yaml的数据文件,其中包含不同的行动要求文本变体,可以在不同的页面上重复,这意味着每个cta文本可以在多个页面上使用

数据/cta.yaml:

然后是layout.erb:

如果我想使用,比如说,第一个CTA文本,我可以在layout.erb布局文件中使用

,或者将其从布局中删除,并将其直接移动到test.html.erb模板文件的末尾。或者,我可以完全删除数据文件,只需在frontmatter中为每个页面键入CTA文本。但是,我更愿意将CTA文本保存在数据文件中,将所有HTML保存在layout.erb中,然后能够从test.HTML.erb frontmatter中的CTA.yaml中选择信息

我试图改变

<p class="cta"><%= data.cta.basic %></p>
然后在test.html.erb frontmatter中:

---
title: Some page for testing
cta: data.cta.basic
---
但这导致了verbatim data.cta.basic text,而不是cta.yaml数据文件中的默认cta

问题
是否可以使用frontmatter从数据文件中选择哪个文本应用于给定页面?

正如我在评论中提到的,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文件:

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

这里有什么特别的吗


您所描述的是预期的行为,因为frontmatter在ERB之前被解析。我认为您有时想在test.html.erb的frontmatter中设置手动CTA,有时想从test.html.erb的frontmatter中引用data/CTA.yml中保存的CTA,对吗?不完全正确:对于大多数使用特定布局的页面,其中包括带有“cta”类的段落,我希望能够引用test.html.erb frontmatter中data/cta.yaml中保存的cta。整个要点是编辑cta在一个地方的数据/cta.yaml,而不需要在每个使用该文本的页面上手动编辑,如果将来文本发生变化。手动CTA文本显示手动输入时它可以工作;很好用!我最初在布局中使用了,但它也可以在页面模板中使用,如答案所示,并将helper放在我的config.rb中,而不是将其保存为单独的模块。
<p class="cta"><%= data.cta.basic %></p>
<p class="cta"><%= current_page.data.cta %></p>
---
title: Some page for testing
cta: data.cta.basic
---
module CtaHelpers
  def page_cta
    cta = current_page.data.cta
    data.cta.send(cta)
  end
end
---
cta: special
---
<p class="cta"><%= page_cta %></p>