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

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

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

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

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


person user1758162    schedule 13.12.2012    source источник


Ответы (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>

И это, в общих чертах, должно быть то, что вы хотите!

person Denis Defreyne    schedule 14.12.2012
comment
Обратите внимание, что если у вас есть непоследовательно нормализованные теги, вы получите дубликаты здесь... и если у вас есть файловая система, нечувствительная к регистру, это может привести к путанице в будущем. Избавь себя от головной боли, с которой я столкнулся, и tag.downcase или что-то в этом роде :) - person bobthecow; 23.01.2013
comment
Это отличный ответ, он должен быть в документации @ddfreyne;). - person Pablo Olmos de Aguilera C.; 06.08.2014
comment
есть ли причина, по которой этого нет в библиотеке тегов, наряду с другими полезными вещами, такими как функция для получения списка тегов и т. д. - person majkinetor; 04.07.2015