2014-09-26 9 views
0

저는 Liquid에 익숙하지 않지만 Ruby에는 익숙하지 않습니다. Liquid이 안전상의 이유 때문에 루비 일 필요는 없다는 것을 알고 있습니다. 그러나, 지킬 블로그에, 나는 플러그인으로 다음과 같은 코드를 정의하려고 :Liquid 태그를 정의하고 문자열을 반환하지만 문자열을 반환하는 처리는하지 않습니까?

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이 필요하지 않습니다.)

첫 번째 오류가 발생하고 두 번째 오류가 발생한 이유는 무엇입니까? 첫 번째 것이하고 싶어하는 것을 할 수있는 방법이 있습니까?

- 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: 

가 사전에 감사합니다

_data/people.yml는 유사 정의된다.

답변

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()를 사용하여) 정수로 캐스팅하라는 조언을 받았는데, 지금은 매력처럼 작동합니다. 도와 줘서 고마워, 데이빗! –

+0

부록 :'person'은'hash'이므로, 값을 되 찾을 열쇠를 주어야합니다. 나는 그것을 임의의 물건처럼 취급하려고 노력했다. Ruby에 이러한 액세스에 대한 명명법이 있는지 확실하지 않습니다. 이것이'person.display'에서'person [ 'display']'로 바뀌는 이유입니다. 우리는 값으로 접근하려고 시도하지 않고 그것을 키로 주어야합니다. 스트리핑에 대한 조언은 건전합니다. 나는 그것을 테스트했지만 스트립 다운을 시도하지 않았다. (정수로 변환 된 것처럼) ... 나는 미래의 사람들에게 유용 할 수있는 다른 노트를 생각할 수 없다 ... –