2009-08-15 13 views
8

Sto provando a rendere un modello liquido all'interno di un layout liquido (Liquid Template lang, non CSS layout liquido). Non riesco a ottenere il rendering della parte di layout. Attualmente utilizzando:Come è possibile eseguire il rendering di un modello all'interno di un layout utilizzando il linguaggio del modello Liquid?

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 

La 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 rendering)

risposta

7

Solo per far sapere a chiunque altro che si imbatte in questo problema, il codice pubblicato sopra funziona effettivamente, il problema è con la variabile denominata @template. Ho rinominato @template e @layout in @_tempalte e @_layout e tutto funziona come previsto.

+0

Sì, ma c'è qualche dirottamento di ricerche di modello e altri gadget si eredita dalla rotaie che rinunciano con il codice di cui sopra. Mentre funziona, non è esattamente "rails-ish" in stile o funzionalità. – Dan

2

Per utilizzare 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) è la seguente ...

La gemma liquida fornisce una vista liquido per le rotaie in modo da poter collegare i binari alla ricerca di modelli "liquidi" quando si chiama #render. Questo liquid_view funziona solo pienamente con le rotaie 2.3 ma può essere facilmente aggiornato per lavorare 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 il liquido guarda chiamare

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

nella nostra applicazione, poiché abbiamo una manciata di attributi liquidi comuni abbiamo sovresposta il metodo "rendering" nel nostro controller di base per includere automaticamente i locali predefinite di r eferencing #liquid_view_assigns che arrotolano inoltre aggiunto gocce di liquido per il render chiamata

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