Come si può rendere un modello all'interno di un layout utilizzando linguaggio di template liquidi?
-
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)
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