2012-07-09 83 views
2

我今天花了試圖爲http://bitcoin.org/clients.html傑基爾隨機排序集合

我們的Bitcoin軟件的列表,做一些簡單的與傑基爾,並每隔一段時間,該頁面被再生。如果客戶的訂單會被隨機分配以獲得同等的曝光,那將是一件好事。

{% random page.clients %} 
{% for client in page.clients %} 
    ... 

我敢肯定,這很簡單:

class Random < Liquid::Tag 
    def initialize(tag_name, collection_name, tokens) 
    @collection_name = collection_name.to_s 
    super 
    end 

    def render(context) 
    collection = context[@collection_name] 
    collection = collection.sort_by{rand} 
    context[@collection_name] = collection 
    super 
    end 
end 

Liquid::Template.register_tag('random', Random) 

爲什麼它不工作?我看到絕對沒有變化。

我以爲我不分配給正確page.clients,因爲如果我嘗試:

context[:foo] = collection 

{% random page.clients %} 
{% for client in page.clients %} 
    ... 

然後我得到一個空白頁。但打印@collection_name顯示「page.clients」...

任何想法?

感謝

回答

3
class Random < Liquid::Tag 
    Syntax = /(\w+[.]?\w+)\s+(\w+)/o 

    def initialize(tag_name, markup, tokens) 
    if markup =~ Syntax 
     @collection_name = $1 
     @randomized_name = $2 
    else 
     raise SyntaxError.new("Syntax Error in 'random' - Valid syntax: random [source] [var]") 
    end 
    super 
    end 

    def render(context) 
    collection = context[@collection_name] 
    collection = collection.sort_by{rand} 
    context[@randomized_name] = collection 
    return 
    end 
end 

Liquid::Template.register_tag('random', Random) 

和:

 {% random page.clients clients %} 
     {% for client in clients %} 
     ... 
1

這現在可以與Jekyll "sample" filter實現..

例如,隨機獲得3個員額...

{% assign posts = site.posts | sample:3 %} 
{% for post in posts %} 
... 
{% endfor %}