2012-02-07 12 views
9

En los carriles 3,0 con HAML (3.1.4) Tengocontent_for vs rendimiento en parciales

  1. alguna plantilla-como parcial, como _template.html.haml:

    .panel.top 
        = yield :panel_top 
    
    .content 
        = yield 
    
  2. algunos otros parcial que se mostrarán usando la plantilla anterior (todo esto se representa utilizando AJAX, pero esto no importa)

    - content_for :panel_top do 
    .title.left 
        = title 
    
    content text 
    

y esto funcionó como un encanto en Rails 3,0

Pero, después de la actualización a 3.2 esto no funciona! Yiels solo produce "Texto del contenido", por lo que tengo "Texto del contenido de" dos veces y ningún título en absoluto

cambiando solamente = yield :panel_top a = content_for :panel_top obras de 3,2

No estoy seguro de que esta solución está bien, y si es estable o recomendado, no puedo encontrar ninguna nota sobre los cambios en el proceso yield ni en las notas de la versión de Rails 3.1 ni en las 3.2.

¿Puede ayudarme con cuál es la mejor manera de organizar yield dentro de los parciales?

Respuesta

10

De Rails 3.0 a Rails 3.2 content_for fue realmente cambió:

3,0:

def content_for(name, content = nil, &block) 
    content = capture(&block) if block_given? 
    @_content_for[name] << content if content 
    @_content_for[name] unless content 
end 

3,2:

def content_for(name, content = nil, &block) 
    if content || block_given? 
    content = capture(&block) if block_given? 
    @view_flow.append(name, content) if content 
    nil 
    else 
    @view_flow.get(name) 
    end 
end 

Esto nos muestra, que a partir de 3,2 content_for obras para mostrar/insertar contenido también, no solo almacenarlo f o sección nombrada.

Además, si intenta depurar la lógica yield, verá que cede antes de que content_for se inicialice correctamente.

Así, dejando el almacenamiento en caché fragmento fuera de esta discusión puedo concluir que content_for es preferible forma de insertar secciones nombradas en cualquier lugar excepto diseños de alto nivel. En helpers y otras situaciones, yield debe mostrar resultados incorrectos.

Cuestiones relacionadas