我是Jekyll的新手,Ruby。我正在尝试为Jekyll创建我的自定义插件。到目前为止我的代码如下。我不理解Ruby编译器行为,现在这段代码不起作用,错误undefined method scan
,但如果我将所有内容从parse
放到initialize
而不是{{} 1}},然后它开始工作。
完成错误:parse(text)
Liquid Exception: undefined method 'scan' for #<Liquid::Tokenizer:0x005577b047a220> in index.html
答案 0 :(得分:4)
如果我放置从
parse
到initialize
而不是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)
scan
是String
类定义的方法。
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