1

我花了很多时间研究这个问题,但没有找到有效的解决方案。如果有人能帮我解决这个问题,我会很高兴的。

我正在尝试在我的设置中使用动态页面,但需要包含动态 Frontmatter。但是我不能在模板文件中使用 Frontmatter,所以我想我可以使用 YAML 数据文件来代替?我尝试了各种方法,但都没有成功。动态页面加载得很好,但是除非我可以拉入动态数据,否则它们中的每一个都将使用相同的 Frontmatter。

我的配置包括:

["england", "france"].each do |team|
  proxy "/teams/#{team}/index.html", "/teams/team.html", :locals => { :team_name => team }, :ignore => true
end

我在本节中的目录结构如下所示:

teams
- index.html.erb
- team.html.erb

我开始了一个 YAML 数据文件,其中包括:

england:
  title: "Teams/England"
  description: "England"
  headline: "England"
  addclass: "england cols"
france:
  title: "Teams/France"
  description: "France"
  headline: "France"
  addclass: "france cols"

当我在模板文件中使用上述数据作为 Frontmatter 时,它工作得很好:

---
title: Teams/France
description: France
headline: France
addclass: france cols
---

我如何使用数据的一个例子:

<%= current_page.data.addclass %>

我的问题如下:

  1. 如何使用 YAML 数据文件为每个动态页面提供唯一数据?
  2. 我可以使用最终的 URI 段(/teams/england/ 中的“england”、/teams/france/ 中的“france”等)来定义要使用的数据集吗?
  3. 我可以在不影响站点上其他非动态页面(/matches/、/groups/ 等)的情况下执行此操作吗?

非常感谢您提前。

4

1 回答 1

0

我建议稍微改变你的数据格式。它允许您将整个本地数据项传递给模板,这样您就可以使用数据而无需先将其“加载”到 Frontmatter 中。

调整你的teams.yml文件(我在这里添加了 'slug' 值):

items:
- title: "England"
  slug: "england"
  description: "England"
  headline: "England"
  addclass: "england cols"
- title: "France"
  slug: "france"
  description: "France"
  headline: "France"
  addclass: "france cols"

将您的块更改config.rb为(假设 teams.yml 位于 /data/teams.yml) - 请注意检查以防止数据丢失时出现错误:

if File.exist?("data/teams.yml")
  data.teams.items.each do |item|
     p = item
     proxy "teams/#{p.slug}.html", "teams/team.html", locals: { item: p }, ignore: true
  end
end

这会将团队项目中的所有数据传递到模板中。您不必“定义要使用的数据集”,因为模板上下文将仅引用该数据项。

现在,在您的team.html.erb模板中,您可以像这样引用数据(在模板正文中,而不是在 Frontmatter 中):

<h1 class="<%= item.addclass %>"><%= item.title %></h1>
<h2><%= item.description %></h2>
<h3><%= item.headline %></h3>

这应该为您提供两个独立的英格兰和法国页面,其中包含各自的独特数据。

不幸的是,Frontmatter 不喜欢在 Middleman 中生成动态页面后被覆盖。为了覆盖您用于元数据的 Frontmatter,特别是“标题”,我使用 gem 'middleman-meta-tags' [ https://github.com/tiste/middleman-meta-tags ] 取得了成功,它允许您覆盖定义后模板正文中的页面标题,来自 YAML 数据。

于 2018-03-09T22:48:10.637 回答