2014-09-26 59 views
0

我是Liquid的新手,但不是Ruby,我知道Liquid出於安全原因不一定是Ruby。然而,在傑基爾博客,我試圖定義以下代碼爲一個插件:定義液體標籤,返回字符串工作,但處理返回字符串不?

module Jekyll 
    class Person_Index < Liquid::Tag 

    def initialize(tag_name, text, tokens) 
     super 
     @text = text 
    end 

    def render(context) 
     for person in context.registers[:site].data["people"] 

     if (person.index.to_s() == @text.to_s()) 
      return person.display 
     end  
     end 

     # We reach here, something's wrong anyway 
     return "((INDEX NOT FOUND #{@text}))" 
    end 
    end 
end 

Liquid::Template.register_tag('Person_Index', Jekyll::Person_Index) 

此,勿庸置疑,文檔生成過程中失敗。調用它作爲{% Person_Index 2 %}給了我這個錯誤:

Liquid Exception: wrong number of arguments (0 for 1) in _posts/2014-07-22-an-entry.md/#excerpt 

我相信一個人的思維「也許它在某種程度上得到了由馬車摘錄代招」。我通過簡單地用第二段作爲測試用例重寫它來試圖解決這個問題。它仍然給出相同的錯誤,它只是不再在#excerpt中。

的直接變化來渲染,使之成爲一個班輪將使其沒有任何猶豫運行,輸出「就好了」(我說的是在引號,因爲它不是所期望的行爲):

def render(context) 
     return "HOW ARE YOU BECAUSE I AM A POTATO" 
    end 

在標籤被調用的地方,這將會輸出從Portal 2提升的線路。 (是的,我知道return在紅寶石中是不必要的,對於他自己。)

爲什麼第一個失敗,第二個失敗?有沒有辦法做第一個似乎想要做的事情?

_data/people.yml定義類似於:

- index: 1 
    nick: Guy 
    display: That Guy 
    name: 
     first: That 
     middle: One 
     last: Guy 
    account: 
     github: greysondn 

- index: 2 
    nick: Galt 
    display: Johnny 
    name: 
     first: John 
     middle: 
     last: Galt 
    account: 
     github: 

預先感謝您。

回答

1

我發現這個問題:

if (person.index.to_s() == @text.to_s()) 
    return person.display 
end 

這裏你的代碼試圖使用指數方法上person.['index'].to_s()更好。同爲person.display => person['display']

一旦在這裏你仍然有person.index.to_s() == @text.to_s()問題。由於您的液體標籤是{% Person_Index 2 %},因此@text是「2」的空格。 所以「2」!=「2」。我們需要剝去字符串:

if (person['index'].to_s().strip == @text.to_s().strip) 

是好的,但我更喜歡

if (person['index'].to_i() == @text.to_i()) 
    return person['display'] 
end 
+0

'person.index.to_s()',其中'index'作爲*屬性訪問*我想..? (您的解決方案表示*參數*含義的小差異,但未來的讀者可能會感到困惑,如果我是正確的。) 除此之外,這是正確的解決方案。我將建議轉換爲整數(使用'to_i()')進行比較,現在就像魅力一樣。 謝謝你的幫助,大衛! – 2014-09-26 21:28:59

+0

附錄:'person'是一個'hash',所以我們需要給它的鍵返回值。我試圖把它當作一個任意的對象來對待。我不確定Ruby是否有這樣的訪問命名法。 這是從'person.display'爲'人[「顯示」]'變化的原因 - 我們必須把它作爲重點,不要試圖訪問它的值。 關於剝離的建議是健全的;我對它進行了測試,但沒有嘗試剝離下來(因爲投射到整數有意義)......我想不出其他可能對未來人們有用的筆記... – 2014-09-26 21:31:19