定义 Liquid 标签,返回字符串有效,但处理返回字符串不起作用?



我是Liquid的新手,但不是Ruby的新手,我知道出于安全考虑,Liquid不一定是Ruby。然而,在一个Jekyll博客中,我试图将以下代码定义为插件:

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

我相信有人在想"也许它不知怎么被窃听摘录的一代抓住了"。我尝试了这种变通方法,简单地用第二段作为测试用例重写它;它仍然给出相同的错误,只是不再出现在#摘录中。

直接更改渲染以使其成为一行,将使其毫不犹豫地运行,并输出"刚刚好"(我在引号中这样说是因为这不是所需的行为):

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

在调用标记的地方,它将输出从Portal 2提升的行。(是的,我知道return在ruby中是不必要的,每个人都有自己的。)

为什么第一个失败,第二个有效?有没有办法做第一个似乎想做的事

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

提前谢谢。

我发现了问题:

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

在这里,您的代码尝试在人员上使用索引方法。CCD_ 4较好。与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

相关内容

  • 没有找到相关文章

最新更新