将args传递给类方法Ruby

时间:2018-04-16 09:13:23

标签: ruby jekyll jekyll-extensions

我是Jekyll的新手,Ruby。我正在尝试为Jekyll创建我的自定义插件。到目前为止我的代码如下。我不理解Ruby编译器行为,现在这段代码不起作用,错误undefined method scan,但如果我将所有内容从parse放到initialize而不是{{} 1}},然后它开始工作。

完成错误:parse(text)

Liquid Exception: undefined method 'scan' for #<Liquid::Tokenizer:0x005577b047a220> in index.html

3 个答案:

答案 0 :(得分:4)

  

如果我放置从parseinitialize而不是parse(text)的所有内容,那么它就会开始工作

如果你不能将一些简单的代码提取到方法中,那么必须继续进行其他的工作。

在这种特定情况下,您将覆盖Liquid的内置parse方法。此方法在内部调用,因此您看到的错误是由Liquid引起的,而不是由您自己的调用引起的。除非您尝试更改Liquid的解析,否则您不应该自己实现该方法。液体需要这种方法才能正常工作。

最简单的解决方法是简单地重命名您的方法,例如:

require 'liquid'

class CreatePicTag < Liquid::Tag
  def initialize(tag_name, text, tokens)
    super
    parse_text(text)
  end

  def parse_text(text)
    pattern = /(?<=\[).+?(?=\])/
    @class = text.scan(pattern)[0]
    @alt   = text.scan(pattern)[1]
    @path  = text.scan(pattern)[2]
  end

  def render(context)
    [@class, @alt, @path].join('|')
  end
end

Liquid::Template.register_tag('create_pig', CreatePicTag)
@template = Liquid::Template.parse("{% create_pig [foo][bar][baz] %}")
p @template.render

输出:

foo|bar|baz

答案 1 :(得分:3)

在调用之前验证文本是否有任何scan方法:

module Jekyll
  class CreatePicTag < Liquid::Tag
    def initialize(tag_name, text, tokens)
      super
      parse(text)
    end

    def parse(text)
      pattern = /(?<=\[).+?(?=\])/
      if text.respond_to?(:scan)
        @class = text.scan(pattern)[0]
        @alt = text.scan(pattern)[1]
        @path = text.scan(pattern)[2]
      end
    end
  end
end

并将其称为:

Jekyll::CreatePicTag.new(tag_name, text, tokens)

答案 2 :(得分:1)

scanString类定义的方法。 undefined method 'scan'表示有时局部变量不是String

因此,您可以稍微修改parse方法,以确保 text始终为String

def parse(text)
  text = text.to_s
  pattern = /(?<=\[).+?(?=\])/

  @class = text.scan(pattern)[0]
  @alt = text.scan(pattern)[1]
  @path = text.scan(pattern)[2]
end