class Liquid::Render
@liquid_syntax_keyword filename The name of the snippet to render, without the ‘.liquid` extension.
{% render ’filename’ %}
@liquid_syntax
> inside the snippet.
> When you render a snippet using the ‘render` tag, you can’t use the [‘include` tag](/docs/api/liquid/tags/include)
> Note:
Outside a snippet or app block, you can’t access variables created inside the snippet or app block.
can access the [‘section` object](/docs/api/liquid/objects/section).
can access the [`product` object](/docs/api/liquid/objects/product), and a snippet or app block inside a [section](/themes/architecture/sections)
directly accessible outside the snippet or app block. For example, a snippet or app block inside the [product template](/themes/architecture/templates/product)
While you can’t directly access created variables, you can access global objects, as well as any objects that are
to pass outside variables to snippets.
of the snippet or app block. However, you can [specify variables as parameters](/docs/api/liquid/tags/render#render-passing-variables-to-a-snippet)
Inside snippets and app blocks, you can’t directly access variables that are [created](/docs/api/liquid/tags/variable-tags) outside
@liquid_description
Renders a [snippet](/themes/architecture#snippets) or [app block](/themes/architecture/sections/section-schema#render-app-blocks).
@liquid_summary
@liquid_name render
@liquid_category theme
@liquid_type tag
@liquid_public_docs
def for_loop?
def for_loop? @is_for_loop end
def initialize(tag_name, markup, options)
def initialize(tag_name, markup, options) super raise SyntaxError, options[:locale].t("errors.syntax.render") unless markup =~ SYNTAX template_name = Regexp.last_match(1) with_or_for = Regexp.last_match(3) variable_name = Regexp.last_match(4) @alias_name = Regexp.last_match(6) @variable_name_expr = variable_name ? parse_expression(variable_name) : nil @template_name_expr = parse_expression(template_name) @is_for_loop = (with_or_for == FOR) @attributes = {} markup.scan(TagAttributes) do |key, value| @attributes[key] = parse_expression(value) end end
def render_tag(context, output)
def render_tag(context, output) # The expression should be a String literal, which parses to a String object template_name = @template_name_expr raise ::ArgumentError unless template_name.is_a?(String) partial = PartialCache.load( template_name, context: context, parse_context: parse_context, ) context_variable_name = @alias_name || template_name.split('/').last render_partial_func = ->(var, forloop) { inner_context = context.new_isolated_subcontext inner_context.template_name = partial.name inner_context.partial = true inner_context['forloop'] = forloop if forloop @attributes.each do |key, value| inner_context[key] = context.evaluate(value) end inner_context[context_variable_name] = var unless var.nil? partial.render_to_output_buffer(inner_context, output) forloop&.send(:increment!) } variable = @variable_name_expr ? context.evaluate(@variable_name_expr) : nil if @is_for_loop && variable.respond_to?(:each) && variable.respond_to?(:count) forloop = Liquid::ForloopDrop.new(template_name, variable.count, nil) variable.each { |var| render_partial_func.call(var, forloop) } else render_partial_func.call(variable, nil) end output end
def render_to_output_buffer(context, output)
def render_to_output_buffer(context, output) render_tag(context, output) end