如何为nanoc中的每个标记生成页面

use*_*162 10 ruby tagging nanoc

我是nanoc的新手,我仍然在找周围的人.我能够准备好我的网站,它看起来很好,功能也很好.但我需要一个标签区域.我能够实现这一目标

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

但是如何为标签生成页面?因此,例如,有一个名为"NFL"的标签,因此每次用户点击它时,他/她应该被引导到http://example.com/tag/nfl与NFL相对应的文章列表.

我可以设置一个可以做到这一点的布局.但是我应该使用什么样的逻辑呢?我也需要帮助吗?

Den*_*yne 21

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

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

如果您想要每个标签的页面,则需要先收集所有标签.我这样做是因为我不想重复:

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

最后,遍历所有标记并为它们生成项目:

tags.each do |tag|
  items << Nanoc::Item.new(
    "",
    { :tag => tag },
    "/tags/#{tag}/")
end
Run Code Online (Sandbox Code Playgroud)

现在,您可以为/ tags/*/创建一个特定的编译规则,以便使用"tags"布局进行渲染,该布局将获取:tag属性的值,查找具有此标记的所有项目并在名单.那个布局看起来有点像这样:

<h1><%= @item[:tag] %></h1>
<ul>
  <% items_with_tag(@item[:tag]).each do |i| %>
    <li><%= link_to i[:title], i %></li>
  <% end %>
</ul>
Run Code Online (Sandbox Code Playgroud)

从广义上说,应该是你想要的!

  • 请注意,如果你有不一致的规范化标签,那么你最终会得到"重复"...如果你有一个不区分大小写的文件系统,它可能会引起各种各样的混乱.保存自己遇到的头痛和`tag.downcase`或者其他的东西:) (5认同)