使用MIddleman 3.0 - 如何在动态页面上设置单个页面标题?

时间:2012-10-01 10:46:53

标签: ruby middleman

我正在为中间人组建一个简单的投资组合网站。我根据本地YAML数据动态生成“工作”页面。这是在config.rb中:

data.work.projects.each do |project|
  page "/work/#{project[0]}.html", :proxy => "project_template.html" do
    @project = project
  end
end

出于搜索引擎优化的目的,我希望这些动态生成的页面中的每一个都具有唯一的页面标题和描述。

标题当前在布局文件中设置,如下所示

  %title
    = current_page.data.title

我知道我可以使用frontmatter来设置像这样的current_page变量

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

我可以将它粘贴到我的project_template.haml中,但是有什么方法可以让这样的东西起作用吗?

---
title: "Recent Work - " + @project.title
---

3 个答案:

答案 0 :(得分:24)

您可以使用content_for,而不是在frontmatter中设置标题(就像您正在做的那样)。

E.g。在布局中:

%title= yield_content(:title)

在动态页面的模板中:

- content_for(:title, @project.title)

答案 1 :(得分:8)

这是最简单的模块化解决方案。

在你的布局中,请输入:

%title= 'Your Site Title | ' + @title

@title是一个ruby实例变量,可供当前页面使用。

在你当前的页面中,扔进去(别忘了破折号):

- @title = 'Your Page Title'

然后你应该好好去!

答案 2 :(得分:3)

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

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

它不像通过current_page.data获取数据那么好和简短,但我只是设法更改了元数据:

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

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

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

我仍然认为/希望必须有更好的解决方案。我们无法为代理页面设置前端数据,这有点奇怪。