Как создавать страницы для каждого тега в наносе

Я новичок в nanoc, и я все еще нахожу его вокруг. Я могу получить мой сайт, он выглядит хорошо и хорошо работает. Но мне нужна область тегов. Я могу добиться этого с помощью

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

Но как мне создавать страницы для тега? Так, например, есть тег под названием "NFL", поэтому каждый раз, когда пользователь нажимает на него, он должен быть направлен на http://example.com/tag/nfl со списком статей, которые соответствуют NFL.

Я могу настроить макет, который сделает это. Но тогда, какую логику я должен использовать? А также мне нужно иметь помощника для этого?

Ответ 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/ */, чтобы оно отображалось с использованием макета "теги", в котором будет приниматься значение атрибута: tag, найти все элементы с этим тегом и показать их в списке. Этот макет будет выглядеть примерно так:

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

И что, в широких мазках, должно быть то, что вы хотите!