Как использовать `relative_url` внутри пользовательского плагина

#ruby #jekyll

#ruby #джекилл

Вопрос:

Я пытаюсь использовать relative_url фильтр внутри плагина.

 module Jekyll
  module Tags
    class MyNewTag < Liquid::Block

      include Jekyll::Filters::URLFilters

      def initialize(tag_name, block_options, liquid_options)
        super
        @class = block_options.strip
      end

      def render(context)

        context.stack do
          context["class"] = @class
          @content = super
          path_js = Jekyll::Filters::URLFilters::relative_url("assets/custom.min.css")
          path_css = Jekyll::Filters::URLFilters::relative_url("assets/custom.min.js")
        end

        output = <<~EOS
        <link rel="stylesheet" href="#{path_js}">
        <script src="#{path_css}"></script>

        EOS
      end
    end
  end
end

Liquid::Template.register_tag('MyNewTag', Jekyll::Tags::MyNewTag)
 

Однако Ruby показывает NoMethodError: undefined method relative_url’ для Jekyll::Filters::URLFilters:Module` — следовательно, я не могу его использовать.

Как я должен включить relative_url фильтр, чтобы я мог использовать его в своем коде?

Ответ №1:

Оказывается, ошибка была вызвана отсутствием контекстной переменной, которая должна быть передана явно @context = context

Это работает, если он отформатирован таким образом:

 module Jekyll
  module Tags
    class MyNewTag < Liquid::Block

      include Jekyll::Filters::URLFilters

      def initialize(tag_name, block_options, liquid_options)
        super
        @class = block_options.strip
      end

      def render(context)

        context.stack do
          context["class"] = @class
          @content = super
          @context = context
          @path_js = relative_url("assets/custom.min.css")
          @path_css = relative_url("assets/custom.min.js")
        end

        output = <<~EOS
        <link rel="stylesheet" href="#{@path_js}">
        <script src="#{@path_css}"></script>

        EOS
      end
    end
  end
end

Liquid::Template.register_tag('MyNewTag', Jekyll::Tags::MyNewTag)