Как визуализировать шаблон внутри макета с помощью языка шаблонов Liquid?

StackOverflow https://stackoverflow.com/questions/1283083

  •  16-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь визуализировать жидкий шаблон в жидком макете (язык жидкого шаблона, а не материал жидкого макета CSS).Кажется, я не могу отобразить часть макета.В настоящее время используется:

assigns = {'page_name' => 'test'}
@layout = Liquid::Template.parse(File.new(@theme.layout.path).read)
@template = Liquid::Template.parse(File.new(self.template.path).read)

@rend_temp = @template.render(assigns)
@rend_layout = @layout.render({'content_for_layout' => @rend_temp})

render :text => @rend_layout, :content_type => :html

Полученный HTML-код страницы показывает, что «шаблон» отображается в жидком виде нормально, но он не заключен в макет (замена «content_for_layout» в макете на отображаемый шаблон).

Это было полезно?

Решение

Просто чтобы сообщить всем, кто сталкивается с этой проблемой: приведенный выше код действительно работает, проблема связана с переменной с именем @template.Я переименовал @template и @layout в @_tempalte и @_layout, и все работает как положено.

Другие советы

Что касается использования Liquid в Ruby на Rails (особенно Rails 3) - я считаю, что правильный способ рендеринга ваших Liquid-шаблонов (а также поддерживать всю работу, которую Rails делает за вас) заключается в следующем...

Liquid gem сам по себе предоставляет Liquid_view для рельсов, так что вы можете подключить рельсы для поиска «жидких» шаблонов при вызове #render.Этот Liquid_View работает только с Rails 2.3, но может быть легко обновлен для работы с Rails 3, сделав следующее обновление

if content_for_layout = @view.instance_variable_get("@content_for_layout")
  assigns['content_for_layout'] = content_for_layout
elsif @view.content_for?(:layout)
  assigns["content_for_layout"] = @view.content_for(:layout)
end
assigns.merge!(local_assigns.stringify_keys)

Это можно увидеть здесь --> https://github.com/danshultz/liquid/commit/e27b5fcd174f4b3916a73b9866e44ac0a012b182

Затем, чтобы правильно отобразить жидкое представление, просто позвоните

render :template => "index", :layout => "my_layout", :locals => { liquid_drop1 => drop, liquid_drop2 => drop }

В нашем приложении, поскольку у нас есть несколько общих атрибутов жидкости, мы переопределили метод «рендеринга» в нашем базовом контроллере, чтобы автоматически включать локальные значения по умолчанию, ссылаясь на #liquid_view_assigns, которые свертывают дополнительно добавленные капли жидкости для вызова рендеринга.

def render(...)
  options[:locals] = options.fetch(:locals, {}).merge(liquid_view_assigns)
  super
end
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top