2012-02-07 23 views
9

in Rails 3.0 con HAML (3.1.4) Hocontent_for vs resa in parziali

  1. qualche modello simile parziale, come _template.html.haml:

    .panel.top 
        = yield :panel_top 
    
    .content 
        = yield 
    
  2. qualche altro parziale che verrà visualizzato utilizzando il modello precedente (tutto questo materiale viene reso utilizzando AJAX, ma questo non importa)

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

e questo ha funzionato come un fascino in Rails 3,0

Ma, dopo l'aggiornamento a 3.2 questo viene a mancare! Yiels solo produce "il contenuto del testo", quindi non ho "il contenuto del testo" due volte e nessun titolo a tutti

solo cambiando = yield :panel_top a = content_for :panel_top opere per 3,2

non sono sicuro che questa soluzione è ok, e se è stabile o raccomandato, non trovo note sulle modifiche nell'elaborazione di yield né nelle note di rilascio di Rails 3.1, né in quelle di 3.2.

Potete aiutare qual è il modo migliore per organizzare yield all'interno di partial?

risposta

10

Da Rails 3.0 a Rails 3.2 content_for era davvero cambiato:

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 

Questo ci mostra, che dal 3,2 content_for opere anche per mostrare/inserire contenuti, non solo memorizzarli f o sezione nominata.

Inoltre, se si tenta di eseguire il debug della logica yield, si otterrà un risultato prima che content_for sia inizializzato correttamente.

Così, lasciando caching dei frammenti di questa discussione posso concludere che content_for è preferibile modo per inserire le sezioni denominate ovunque tranne layout di alto livello. In helper e altre situazioni, yield dovrebbe restituire risultati errati.