2009-06-26 14 views

risposta

13

È necessario utilizzare CaptureHelper.

def my_div(some_options, &block) 
    # capture the value of the block a string 
    content = capture(&block) 
    # concat the value to the output 
    concat(content) 
end 

<% my_div([]) do %> 
    <p>The content</p> 
<% end %> 


def my_div(some_options, &block) 
    # capture the value of the block a string 
    # and returns it. You MUST use <%= in your view. 
    capture(&block) 
end 

<%= my_div([]) do %> 
    <p>The content</p> 
<% end %> 

Utilizzare capture + concat se è necessario concatenare l'output. Utilizzare l'acquisizione se è necessario acquisire e riutilizzare il contenuto. Se il tuo blocco non usa esplicitamente <% =, allora DEVE chiamare concat (modo preferito).

Questo è un esempio di un metodo che nasconde il contenuto se l'utente non è un amministratore.

def if_admin(options = {}, &block) 
    if admin? 
    concat content_tag(:div, capture(&block), options) 
    end 
end 

<% if_admin(:style => "admin") do %> 
<p>Super secret content.</p> 
<% end %> 
2

http://www.rubycentral.com/book/tut_containers.html

L'istruzione yield restituirà il risultato del blocco passato. Quindi, se si voleva stampare (console?)

def my_div &block 
    yield 
end 

my_div { puts "Something" } 

uscita avrebbe "Something"

Ma: Qual è l'idea del metodo? Emissione di un DIV?

+0

weppos ha una risposta molto migliore 8) –

Problemi correlati