You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jekyll自定义插件报错:undefined method 'scan' 问题求助

解决Jekyll自定义Tag中undefined method 'scan'的问题

我来帮你理清这个问题的根源——其实这和Ruby的“编译行为”没关系,而是Liquid Tag的方法职责和参数类型搞混了!

错误原因拆解

你遇到的报错undefined method 'scan' for #<Liquid::Tokenizer:0x005577b047a220>,核心问题一目了然:

  • initialize方法的第二个参数markup是字符串类型(就是你写在标签里的原始内容,比如{% create_pic arg1 arg2 %}里的arg1 arg2),字符串本身自带scan方法,所以把代码移到这里能正常运行。
  • 而parse方法接收的参数是Liquid::Tokenizer对象,这是Liquid用来解析模板动态语法(比如变量、嵌套标签)的工具类,它根本没有scan这个字符串操作方法,直接调用自然会报错。

Liquid Tag方法的正确分工

Liquid的Tag类里,这两个方法的职责本来就有明确划分:

  • initialize:负责初始化标签实例,通常用来处理标签的静态参数(也就是markup字符串),比如用正则提取参数、保存配置等。
  • parse:负责解析标签内部的Liquid动态语法(比如标签里嵌套了{{ page.title }}这种变量),它的参数tokens是Liquid的解析器,不是给你处理原始字符串用的。

修正示例

假设你的原代码错误地把scan放在了parse里,正确的写法应该把字符串处理逻辑移到initialize中:

module Jekyll
  class CreatePicTag < Liquid::Tag
    def initialize(tag_name, markup, tokens)
      super # 必须调用父类的initialize方法完成基础初始化
      # 在这里处理markup字符串,用scan提取你需要的内容
      @pic_params = markup.scan(/(\S+)/) # 示例:提取所有非空白字符作为参数
    end

    def render(context)
      # 在这里使用@pic_params生成最终的HTML内容
      "<img src='#{@pic_params[0][0]}' alt='#{@pic_params[1][0]}' class='custom-pic'>"
    end
  end
end

Liquid::Template.register_tag('create_pic', Jekyll::CreatePicTag)

额外提示

如果你的标签需要支持Liquid动态变量(比如用户传入{% create_pic {{ page.image }} %}),那才需要在parse里处理tokens,但这时候要用到Liquid的官方解析API(比如parse_expression),而不是直接调用scan。

内容的提问来源于stack exchange,提问作者Rami Chasygov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:06:20