Techioz Blog

nanoc でタグごとにページを生成する方法

概要

私は nanoc を初めて使用するので、まだやり方を模索中です。サイトの準備ができました。見た目も機能も良好です。ただし、タグ領域が必要です。私はそれを達成することができます

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

しかし、タグ用のページを生成するにはどうすればよいでしょうか?たとえば、「NFL」というタグがあるため、ユーザーがそれをクリックするたびに、NFL に対応する記事のリストが表示される http://example.com/tag/nfl に誘導される必要があります。

それを行うレイアウトをセットアップできます。しかし、それではどのようなロジックを使用すればよいのでしょうか?また、これにはヘルパーが必要ですか?

解決策

新しい項目を動的に生成するために、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>

そして、大まかに言えば、それがあなたが望むものであるはずです。