2012-05-25 6 views
6

Estoy tratando de crear un contenido dinámico con yield y content_for. Básicamente tengo muchos diseños. Y no quiero crear un montón de vistas para cada diseño. Quiero renderizar partes cuando las necesite. Para diferentes partes del código, está bien. Pero tengo un problema con las mismas partes con contenido diferente.Pasar parámetros para ceder en Rails 3 (¿o es posible?)

en mi application.html.erb

<%= yield %> 
<%= yield :name_section %> 

Y en mi show.html.erb tengo;

<% content_for :name_section do %> 
    <b>Name:</b> 
    <%= @post.name %> 
<% end %> 

Aquí está la pregunta;

¿Qué pasa si quiero múltiples nombre_sección con diferentes contenidos. Quiero decir; Quiero poner :name_section diferentes lugares en mi vista con diferentes contenidos.

Por ejemplo;

<table> 
    <tr> 
    <td> 
     <%= yield :name_section %> 
    </td> 
    </tr> 
    <tr> 
    <td> 
     <%= yield :name_section %> 
    </td> 
    </tr> 
</table> 

¿Alguna idea?

Gracias. Çağdaş

+0

¿por qué necesitan el mismo nombre? Claro que el rubí hace magia, pero sí lee las mentes. – drhenner

+0

con diferentes nombres tengo que duplicar mi código. pero creo que resuelvo este problema con ayudantes. gracias por la respuesta de todos modos. –

+0

no se olvide de no duplicar el código y la responsabilidad individual son importantes – drhenner

Respuesta

2

La siguiente solución me ha funcionado muy bien. No le permite pasar argumentos, pero si, justo antes de llamar al content_for (la segunda vez), asigna sus argumentos a variables de instancia, esto le permite hacer referencia a las variables de instancia en content_for. La idea básica es que content_for genera el contenido cuando se llama la primera vez y que el contenido permanece estático, pero esta solución retrasa la generación de contenido estático hasta que esté listo para mostrar el contenido.

En primer lugar, añadir esta función a su módulo de ayuda:

def immediate_content_for name, content = nil, &block 
    @immediate_content ||= {} 
    if content || block_given? then 
    @immediate_content[name] = Proc.new { content_for name, content, &block } 
    nil 
    else 
    @immediate_content[name].call 
    content_for name 
    end 
end 

Entonces, supongamos que desea pasar a arg1content_for. Ahora puede hacer esto:

<% content_for :my_form %> 
    <%= some_helper_function(@arg1) %> 
<% end %> 

Entonces, adelante en el código, después de su definido arg1:

<%= @arg1 = arg1 %> 
<%= content_for :my_form %> 

Es un corte en el sentido de que no puedo garantizar que el comportamiento de immediate_content_for es en cualquier otra forma idéntica a la de content_for, y si el comportamiento de content_for cambia en alguna versión futura de los rieles, necesitará actualizar immediate_content_for si desea que continúe duplicando content_for. Aunque no es una solución óptima, hace el trabajo por el momento.

Cuestiones relacionadas