使用Middleman 3.0 - 如何在动态页面上设置单独的页面标题?

13

我正在使用middleman搭建一个简单的作品集网站。我根据本地的YAML数据动态生成“作品”页面。以下是config.rb的内容:

data.work.projects.each do |project|
  page "/work/#{project[0]}.html", :proxy => "project_template.html" do
    @project = project
  end
end
为了SEO的目的,我希望每一个动态生成的页面都有一个独特的页面标题和描述。当前,标题是在布局文件中设置的,如下所示:
  %title
    = current_page.data.title

我知道可以使用frontmatter来设置当前页面变量,就像这样

---
title: "Recent Work - "
---

我可以将此内容放入我的project_template.haml中,但是否有任何方法使其正常工作?

---
title: "Recent Work - " + @project.title
---
3个回答

24

不要像你现在所做的那样在frontmatter中设置标题,而应该使用content_for。

例如,在布局中:

%title= yield_content(:title)

并在动态页面的模板中:

- content_for(:title, @project.title)


谢谢!content_for方法可行,只需在布局中使用yield_content(:title)即可。 - Jan Drewniak

9
以下是最简单、模块化的解决方案。
在您的布局中,加入以下代码:
%title= 'Your Site Title | ' + @title

@title是一个Ruby实例变量,它将在当前页面中可用。

在您的当前页面中,添加以下内容(不要忘记横线):

- @title = 'Your Page Title'

然后你就可以开始了!

3

我找到了另一种解决这个限制的方法。不要获取页面数据,而是从元数据中获取frontmatter数据:

%title = current_page.metadata[:page]['title']

虽然不如通过current_page.data获取数据那样简洁明了,但我已经成功修改了元数据:

proxy newpath, oldpath, :page => { 'title' => newtitle }

我不确定为什么,但是如果我记得正确的话,我必须在准备好后设置元数据资源:

resource.add_metadata :page => { 'title' => newtitle }

我仍然认为/希望有更好的解决方案。我们不能为代理页面设置frontmatter数据,这有些奇怪。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接