12 Stimmen

Wie kann man eine Vorlage innerhalb eines Layouts mit der Liquid-Vorlagensprache darstellen?

Ich versuche, eine flüssige Vorlage in einem flüssigen Layout zu rendern (Liquid Template lang, nicht CSS liquid layout stuff). Ich kann nicht scheinen, um das Layout Teil zu rendern. Derzeit mit:

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

Der resultierende HTML-Code der Seite zeigt, dass die "Vorlage" gut in Flüssigkeit gerendert wurde, aber nicht mit dem Layout umhüllt ist (Ersetzen von "content_for_layout" im Layout durch die gerenderte Vorlage)

9voto

bwizzy Punkte 1581

Nur damit alle, die auf dieses Problem stoßen, wissen, dass der oben gepostete Code tatsächlich funktioniert, liegt das Problem bei der Variablen namens @template. Ich habe @template und @layout in @_tempalte und @_layout umbenannt und alles funktioniert wie erwartet.

2voto

Dan Punkte 1376

Für die Verwendung von Flüssigkeit in Ruby on Rails (insbesondere Rails 3) - Ich glaube, der richtige Weg, um Ihre Flüssigkeit Vorlagen zu rendern (und auch alle die Arbeit Rails tut für Sie) ist wie folgt...

Das Liquid Gem selbst stellt eine liquid_view für Rails zur Verfügung, so dass Sie die Rails verdrahten können, um nach "flüssigen" Templates zu suchen, wenn Sie #render aufrufen. Diese liquid_view funktioniert nur vollständig mit rails 2.3 kann aber leicht auf Rails 3 aktualisiert werden, indem man folgendes Update durchführt

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)

Dies kann hier eingesehen werden --> https://github.com/danshultz/liquid/commit/e27b5fcd174f4b3916a73b9866e44ac0a012b182

Um Ihre Flüssigkeitsansicht richtig zu rendern, rufen Sie einfach

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

Da wir in unserer Anwendung eine Handvoll gemeinsamer Flüssigkeitsattribute haben, haben wir die "Render"-Methode in unserem Basis-Controller überschrieben, um die Standard-Locals automatisch einzubeziehen, indem wir #liquid_view_assigns referenzieren, die zusätzlich hinzugefügte Flüssigkeitstropfen für den Render-Aufruf aufrollen

def render(...)
  options[:locals] = options.fetch(:locals, {}).merge(liquid_view_assigns)
  super
end

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X