2012-12-13 8 views
10

私はnanocを初めて使用しています。私は私のサイトを準備することができる、それは良いと機能も良いように見える。しかし、私はタグ領域を持つ必要があります。私はそれを達成することができますnanocの各タグのページを生成する方法

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

しかし、私はどのようにタグのページを生成するのですか?たとえば、NFLと呼ばれるタグがあるので、ユーザーがクリックするたびにNFLに対応する記事のリストをhttp://example.com/tag/nflに送信する必要があります。

これを行うレイアウトをセットアップできます。しかし、私はどのようなロジックを使用すべきですか?また、私はこれのための助けを必要とする必要がありますか?

答えて

21

新しいアイテムを動的に生成するために、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"レイアウトを使ってレンダリングされるようにします。そのレイアウトは、次のようになります。

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

そして、それはあなたの望むものでなければなりません!

+0

大変ありがとうございます:) – user1758162

+5

一貫性のないタグを正規化すると、ここでは「重複」となります。大文字と小文字を区別しないファイルシステムを使用すると、さまざまな混乱を招く可能性がありますこの線。 'tag.downcase'か何かを最初に実行したときの頭痛を覚悟してください。 – bobthecow

+0

これはすばらしい答えです。それはドキュメント@ddfreyne;にあるはずです)。 –