如何在nanoc中为每个标签生成页面

10

我对nanoc还很陌生,仍在摸索中。我已经能够准备好我的网站,它看起来很不错,功能也很好。但我需要一个标签区域。我可以通过使用

来实现这一点。

<%= tags_for(post, params = {:base_url => "http://example.com/tag/"}) %>

但是我如何为标签生成页面呢?例如有一个叫做“NFL”的标签,所以每次用户点击它时,应该重定向到 http://example.com/tag/nfl 并显示与 NFL 相关的文章列表。

我可以设置一个布局来实现这一点。但是我应该使用什么样的逻辑呢?还需要为此编写助手吗?

1个回答

21

您可以在Rules文件中使用预处理块来动态生成新的项目。下面是一个预处理块示例,其中添加了一个新项目:

preprocess do
  items << Nanoc::Item.new(
    "some content here",
    { :attributes => 'here', :awesomeness => 5000 },
    "/identifier/of/this/item")
end

如果您想要每个标签的页面,首先需要收集所有的标签。我使用set进行此操作,因为我不希望出现重复:

require 'set'
tags = Set.new
items.each do |item|
  item[:tags].each { |t| tags.add(t.downcase) }
end

最后,遍历所有标签并为它们生成项目:
tags.each do |tag|
  items << Nanoc::Item.new(
    "",
    { :tag => tag },
    "/tags/#{tag}/")
end

现在,您可以为/tags/* /创建特定的编译规则,以便使用“标签”布局进行呈现,该布局将获取:tag属性的值,查找所有具有此标签的项目并在列表中显示它们。该布局大致如下:
<h1><%= @item[:tag] %></h1>
<ul>
  <% items_with_tag(@item[:tag]).each do |i| %>
    <li><%= link_to i[:title], i %></li>
  <% end %>
</ul>

那么,总体来说,这就是你想要的内容!

5
请注意,如果您的标签归一化存在不一致,最终会出现“重复”情况... 如果您使用的是大小写不敏感的文件系统,这可能会在后续操作中导致各种混乱。为了避免遇到我遇到的问题,请先执行 tag.downcase 或者其他类似操作来进行标签转换。 - bobthecow
这是一个很棒的答案,应该放在文档中 @ddfreyne ;)。 - Pablo Olmos de Aguilera C.
这个东西为什么不在标签库里面呢?还有其他有用的东西,比如获取标签列表的函数等。 - majkinetor

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