2009-08-15 26 views
8

Estoy intentando representar una plantilla líquida dentro de un diseño líquido (Liquid Template lang, no CSS liquid layout stuff). Parece que no puedo hacer que la parte del diseño sea renderizada. Actualmente usando:¿Cómo se puede representar una plantilla dentro de un diseño usando el lenguaje de plantilla 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 

El HTML resultante de la página muestra que la 'plantilla' generado en finas de líquido, pero no se envuelve con la disposición (reemplazando 'content_for_layout' en el diseño con la plantilla mostrada)

Respuesta

7

Solo para que alguien más sepa quién se encuentra con este problema, el código publicado anteriormente realmente funciona, el problema es con la variable llamada @template. Cambié el nombre a @template, y @layout a @_tempalte, y @_layout y todo funciona como se esperaba.

+0

Sí, pero hay un poco de secuestro de las búsquedas de plantilla y otras golosinas se hereda de los carriles que renunciar con el código de seguridad. Mientras funciona, no es exactamente "rails-ish" en estilo o funcionalidad. – Dan

2

Para poder utilizar el líquido en Ruby on Rails (especialmente los carriles 3) - Creo que la forma correcta de hacer las plantillas de líquidos (y también mantener todos los carriles de trabajo está haciendo por usted) es la siguiente ...

La gema líquida proporciona una vista de líquido para los rieles, por lo que puedes cablear los rieles para buscar plantillas "líquidas" cuando llamas a #render. Este liquid_view sólo funciona plenamente con los carriles de 2.3 pero puede ser fácilmente actualizado para trabajar con los carriles 3 al hacer la siguiente actualización

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) 

Esto se puede ver aquí ->https://github.com/danshultz/liquid/commit/e27b5fcd174f4b3916a73b9866e44ac0a012b182

Luego de hacer correctamente el líquido Ver sólo llamar

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

en nuestra aplicación, ya que tenemos un puñado de atributos líquidos comunes que hemos anulado el método "render" en nuestro controlador base para incluir automáticamente los locales predeterminados por r #liquid_view_assigns eferencing el que se enrollan, además, añaden gotas de líquido para hacer la llamada

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