Использование жидких переменных внутри вызова жидкой метки
Я сделал собственный тег ссылки в Liquid, и я пытаюсь передать переменные жидкости в вызов для этого тега, например:
{{ assign id = 'something' }} // this value is actual dynamic while looping through data
{% link_to article: id, text: 'Click Me!' %} // my custom tag
Однако это приводит к тому, что параметр статьи передается как "id", а не "что-то" в соответствии с выражением присваивания над ним.
Кто-нибудь знает, как передать переменные в вызовы тегов?
Ответы
Ответ 1
Не похоже, что это возможно, мое решение состояло в том, чтобы просто передать имя переменной в тег и вытащить его из контекста, в который помещается тег. Например:
{% 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
Ответ 2
Недавно я решил это очень просто с Jekyll 0.11.2 и Liquid 2.3.0, передав имя переменной в качестве параметра тега.
{% assign v = 'art' %}
{% link_to_article v %}
Вы также можете передать имя элемента управления var в цикле, например article
.
В Liquid::Tag.initialize
, @markup
- второй параметр, строка, следующая за именем тега. Назначенные переменные доступны на верхнем уровне context
.
def render(context)
"/#{context[@markup.strip]}/"
end
Это, очевидно, разрешает только один параметр. Более сложное решение будет анализировать параметры, такие как x: 2, y: 3
.
Ответ 3
Это разрешило мне случай context[@markup.strip]
.
Моя проблема заключалась в том, что я хотел передать переменную в свой пользовательский тег Liquid следующим образом: {% 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)
* Это просто более богатый пример того, что ответ выше Джонатана Джулиана
Ответ 4
Было бы здорово иметь тег, который можно вызвать с помощью литералов и переменных типа
{% assign v = 'art' %}
{% link_to_article v %}
или
{% link_to_article 'art' %}
или
{% link_to_article "art" %}
а также, конечно,
{% link_to_article include.article %}
Для этого я предлагаю вспомогательную функцию
def get_value(context, expression)
if (expression[0]=='"' and expression[-1]=='"') or (expression[0]=="'" and expression[-1]=="'")
# it is a literal
return expression[1..-2]
else
# it is a variable
lookup_path = expression.split('.')
result = context
puts lookup_path
lookup_path.each do |variable|
result = result[variable] if result
end
return result
end
end
И в рендеринг просто вызовите вспомогательную функцию, чтобы получить значение литерала или переменной.
def render(context)
v = get_value(context, @markup.strip)
end
FYI, инициализатор будет выглядеть следующим образом:
def initialize(tag_name, markup, tokens)
@markup = markup
super
end