2011-04-04 9 views
12

Ho usato questo modello per un numero di helper in rails 2, ma non funziona allo stesso modo in rails 3. Il mio obiettivo è avere un metodo helper per generare alcuni tag html con contenuto annidato all'interno. Ecco un esempio di base di quello che sto cercando di ottenere:Come si arrende un metodo di supporto a un blocco in rotaie 3?

<div class="box"> 
    my content 
</div> 

In rotaie 2 lo faccio come questo:

dentro il mio file di layout che io chiamo il metodo di supporto:

<% box_wrapper do %> 
    <%= yield -%> 
    <% end %> 

il metodo di supporto è definito in questo modo:

def box_wrapper 
    concat <<-EOF.html_safe 
    <div class="box"> 
    EOF 

    yield if block_given? 
    concat <<-EOF.html_safe 
    </div> 
    EOF 
end 

Ma in rails 3, quando lo sguardo si rendeva emette tutta la mia una pagina d poi all'interno dello box_wrapper esegue il rendering di tutto il contenuto della pagina una seconda volta.

Penso che mi manchi qualcosa di ovvio su come utilizzare gli aiutanti e le rese. Qualche idea?

risposta

31

In Rails 3, non è più necessario utilizzare il metodo concat per creare il contenuto dei blocchi.

vostro aiuto ora assomiglia a questo:

def box_wrapper(&block) 
    content = capture(&block) 
    content_tag(:div, content, :class => 'box') 
end 

Potete vedere altri esempi in Railscasts 208.

+1

semplicemente inoltrando la raccomandazione di R. Bates: "AGGIORNAMENTO: mi raccomando di utilizzare il metodo" capture "invece di" with_output_buffer ".Questo ha il vantaggio di lavorare al di fuori delle visualizzazioni ERB. Il codice di seguito è stato aggiornato." – apneadiving

+0

@apneadiving - Grazie per quello, sicuramente un miglioramento. –

+0

Grazie! Il mio vero uso è più complicato di un semplice content_tag, ma è stato sufficiente per farmi iniziare. – nimblegorilla

Problemi correlati