首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Liquid标记调用中使用liquid变量

在Liquid标记调用中使用liquid变量
EN

Stack Overflow用户
提问于 2011-10-28 01:06:08
回答 5查看 9.5K关注 0票数 19

我在Liquid中创建了一个自定义链接标记,并尝试将liquid变量传递到该标记的调用中,如下所示

代码语言:javascript
复制
{{ assign id = 'something' }} // this value is actual dynamic while looping through data 
{% link_to article: id, text: 'Click Me!' %} // my custom tag

然而,这会导致文章参数被作为'id‘传递,而不是像上面的赋值语句那样作为'something’传递。

有人知道如何将变量传递到标记调用中吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-10-29 01:00:53

这看起来是不可能的,我的解决方案是将变量名传递到标记中,并从呈现标记的上下文中获取它。如下所示:

代码语言:javascript
复制
{% for article in category.articles %}
  {% link_to variable: article, text: title %}
{% endfor %}

在我的标记代码(精简)中:

代码语言:javascript
复制
def render(context)
  uri = "article/#{context[@options[:variable]]['id']}"
  "<a href='#{uri}'>#{build_link_text context}</a>"
end
票数 6
EN

Stack Overflow用户

发布于 2012-08-12 23:01:39

我最近使用Jekyll 0.11.2和Liquid 2.3.0非常简单地解决了这个问题,方法是将变量的名称作为tag参数进行传递。

代码语言:javascript
复制
{% assign v = 'art' %}
{% link_to_article v %}

您还可以在循环中传递控件变量的名称,就像上面的article一样。

Liquid::Tag.initialize中,@markup是第二个参数,即标记名称后面的字符串。指定的变量位于context的顶层。

代码语言:javascript
复制
def render(context)
  "/#{context[@markup.strip]}/"
end

这显然只允许传递一个参数。更复杂的解决方案是解析参数,如x: 2, y: 3

票数 10
EN

Stack Overflow用户

发布于 2014-04-15 01:31:59

这为我解决了这个问题,context[@markup.strip]

我的问题是,我希望能够将一个变量传递给我的自定义液体标记,如下所示:{% get_menu main_menu navigation.html settings.theme.id %}

为此,我首先在每个空格字符上将变量字符串拆分成不同的变量。

代码语言:javascript
复制
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上面的答案更丰富的例子

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7919644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档