【问题标题】:How to generate pages for each tag in nanoc如何为 nanoc 中的每个标签生成页面
【发布时间】:2012-12-01 17:08:47
【问题描述】:

我是 nanoc 的新手,我仍然在它周围找到我的。我能够准备好我的网站,它看起来不错,功能也很好。但我需要有一个标签区域。我可以通过

实现这一目标
<%= tags_for(post, params = {:base_url => "http://example.com/tag/"}) %>

但是如何为标签生成页面呢?例如,有一个名为“NFL”的标签,因此每次用户点击它时,他/她都应该被定向到http://example.com/tag/nfl,并提供与 NFL 对应的文章列表。

我可以设置一个布局来做到这一点。但是那我应该使用什么样的逻辑呢?而且我还需要一个帮手吗?

【问题讨论】:

    标签: ruby tagging nanoc


    【解决方案1】:

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

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

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

    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/*/ 创建一个特定的编译规则,以便使用“tags”布局呈现它,该布局将采用 :tag 属性的值,查找具有此标记的所有项目并显示他们在一个列表中。该布局看起来有点像这样:

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

    总的来说,这应该是你想要的!

    【讨论】:

    • 请注意,如果你有不一致的规范化标签,你会在这里得到“重复”......如果你有一个不区分大小写的文件系统,它可能会给你带来各种各样的混乱.省去我遇到的头痛和tag.downcase 或首先:)
    • 这是一个很好的答案,它应该在文档中@ddfreyne ;)。
    • 是否有任何原因不在标记库中,以及其他有用的东西,例如获取标记列表的功能等。
    猜你喜欢
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    • 2023-04-05
    • 2022-01-26
    • 2011-12-29
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    相关资源
    最近更新 更多