我在Liquid中创建了一个自定义链接标记,并尝试将liquid变量传递到该标记的调用中,如下所示
{{ assign id = 'something' }} // this value is actual dynamic while looping through data
{% link_to article: id, text: 'Click Me!' %} // my custom tag然而,这会导致文章参数被作为'id‘传递,而不是像上面的赋值语句那样作为'something’传递。
有人知道如何将变量传递到标记调用中吗?
发布于 2011-10-29 01:00:53
这看起来是不可能的,我的解决方案是将变量名传递到标记中,并从呈现标记的上下文中获取它。如下所示:
{% for article in category.articles %}
{% link_to variable: article, text: title %}
{% endfor %}在我的标记代码(精简)中:
def render(context)
uri = "article/#{context[@options[:variable]]['id']}"
"<a href='#{uri}'>#{build_link_text context}</a>"
end发布于 2012-08-12 23:01:39
我最近使用Jekyll 0.11.2和Liquid 2.3.0非常简单地解决了这个问题,方法是将变量的名称作为tag参数进行传递。
{% assign v = 'art' %}
{% link_to_article v %}您还可以在循环中传递控件变量的名称,就像上面的article一样。
在Liquid::Tag.initialize中,@markup是第二个参数,即标记名称后面的字符串。指定的变量位于context的顶层。
def render(context)
"/#{context[@markup.strip]}/"
end这显然只允许传递一个参数。更复杂的解决方案是解析参数,如x: 2, y: 3。
发布于 2014-04-15 01:31:59
这为我解决了这个问题,context[@markup.strip]。
我的问题是,我希望能够将一个变量传递给我的自定义液体标记,如下所示:{% get_menu main_menu navigation.html settings.theme.id %}
为此,我首先在每个空格字符上将变量字符串拆分成不同的变量。
class GetMenu < Liquid::Tag
include ApplicationHelper
def initialize(tag_name, variables, tokens)
@variables = variables.split(" ")
@menu_object = @variables[0]
@file_name = @variables[1]
@theme_id = @variables[2]
super
end
def render(context)
# This is where i use context[@theme_id.strip] to get the variable of "settings.theme.id"
content = CodeFile.find_by(hierarchy: 'snippet', name: @file_name.to_s, theme_id: context[@theme_id.strip])
@menu ||= Menu.find_by_slug(@menu_object)
context.merge('menu' => @menu)
Liquid::Template.parse(content.code).render(context)
end
end
Liquid::Template.register_tag('get_menu', GetMenu)*这只是一个比Jonathan Julian上面的答案更丰富的例子
https://stackoverflow.com/questions/7919644
复制相似问题