Come si può rendere un modello all'interno di un layout utilizzando linguaggio di template liquidi?

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

  •  16-09-2019
  •  | 
  •  

Domanda

Sto cercando di rendere un modello di liquido all'interno di un layout liquido (Liquid Template Lang, non CSS roba di layout liquido). Io non riesco a ottenere la parte di layout per rendere. Attualmente utilizzando:

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

Il risultante HTML della pagina mostra che il 'modello' reso in fine liquido, ma non è avvolto con il layout (sostituendo 'content_for_layout' nel layout con il modello di rendering)

È stato utile?

Soluzione

Proprio per permettere a nessuno altro sa chi si imbatte in questo problema, il codice postato sopra effettivamente funziona, il problema è con il @Template variabile chiamata. Ho rinominato @Template, e @layout a @_tempalte, e @_layout e tutto funziona come previsto.

Altri suggerimenti

Per usare liquido in Ruby on Rails (soprattutto rotaie 3) - Credo che il modo corretto per rendere i modelli liquidi (e anche mantenere tutti i binari di lavoro sta facendo per voi) è il seguente ...

La gemma liquido stesso fornisce un liquid_view per le rotaie in modo da poter collegare i binari alla ricerca di modelli di "liquidi" quando si chiama # RENDERING. Questo liquid_view funziona solo pienamente con Rails 2.3 ma può essere facilmente aggiornato per funzionare con le rotaie 3, rendendo il seguente aggiornamento

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)

Questo può essere visto qui -> https://github.com/danshultz/liquid/ commit / e27b5fcd174f4b3916a73b9866e44ac0a012b182

Poi per rendere correttamente la visualizzazione liquido basta chiamare

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

Nella nostra applicazione, dal momento che abbiamo una manciata di attributi liquidi comuni abbiamo sovresposta il metodo "render" nel nostro controller di base per includere automaticamente la gente del posto di default facendo riferimento #liquid_view_assigns che rotolano fino gocce di liquido inoltre aggiunto per la chiamata di rendering

def render(...)
  options[:locals] = options.fetch(:locals, {}).merge(liquid_view_assigns)
  super
end
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top