#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)