2009-06-26 19 views

Respuesta

13

Debe usar 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 %> 

Utilice captura + concat si necesita concat la salida. Use la captura si necesita capturar y luego reutilizar el contenido. Si su bloque no usa explícitamente <% =, entonces DEBE llamar a concat (forma preferida).

Este es un ejemplo de un método que oculta el contenido si el usuario no es un administrador.

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

La sentencia yield devolverá el resultado del bloque pasado. Así que si usted desea imprimir (consola?)

def my_div &block 
    yield 
end 

my_div { puts "Something" } 

salida sería "algo"

Pero: ¿Cuál es la idea de que su método? ¿Dando salida a un DIV?

+0

weppos tiene una respuesta mucho mejor 8) –

Cuestiones relacionadas