2011-04-12 9 views
6

Tengo un bloque grande de HTML en mi aplicación que me gustaría mover a una plantilla compartida y luego uso content_for con yields para insertar el contenido necesario. Sin embargo, si lo uso más de una vez en el mismo archivo de diseño, el contenido se agrega al anterior, por lo que la idea no funciona tan bien. ¿Hay una solución para esto?Múltiple content_for en la misma página

<div class="block side"> 
    <div class="block_head"> 
     <div class="bheadl"></div> 
     <div class="bheadr"></div> 
     <h2><%= yield :block_head %></h2> 
    </div> 
    <div class="block_content"> 
     <%= yield :block_content %> 
    </div> 
    <div class="bendl"></div> 
    <div class="bendr"></div> 
</div> 

y uso el siguiente código para establecer el contenido para el bloque

<%= overwrite_content_for :block_head do -%> 
     My Block 
    <% end -%> 
    <%= overwrite_content_for :block_content do -%> 
     <p>My Block Content</p> 
    <% end -%> 
    <%= render :file => "shared/_blockside" %> 

El problema es si uso esto varias veces en la misma disposición el contenido del bloque original se anexa al bloque secundaria

he intentado crear un método de ayuda personalizada para llegar a su alrededor, sin embargo, no devuelve ningún contenido

def overwrite_content_for(name, content = nil, &block) 
    @_content_for[name] = "" 
    content_for(name, content &block) 
    end 

Es posible que también me esté yendo completamente mal y si hay mejores métodos para hacer que el contenido funcione de esta manera, me gustaría saberlo. Gracias.

Respuesta

1

Debe definir su overwrite_content_for como las siguientes (si entiendo bien su pregunta):

def overwrite_content_for(name, content = nil, &block) 
    content = capture(&block) if block_given? 
    @_content_for[name] = content if content 
    @_content_for[name] unless content 
    end 

Tenga en cuenta, que en caso de que sus rendimientos bloque nil, entonces el contenido de edad serán retenidos. Sin embargo, la idea no suena bien, ya que obviamente estás haciendo renderizado (o al menos instanciación de objetos) dos veces.

+0

Esto hizo el truco gracias. Comprendo el problema de renderizar dos veces, pero parece que usar content_for y layouts es preferible a pegar en el bloque grande de HTML en todas partes donde lo necesito. –

+0

¿No puedes salirte con parciales normales? – Roman

+0

Bueno, en algunos casos estoy pasando una gran cantidad de contenido HTML en el rendimiento: block_content. No estoy seguro de cómo lograría eso con parciales. –

-1

Usted puede utilizar el nombre content_for y yield bloques de la siguiente manera:

Vista:

<% content_for :heading do %> 
    <h1>Title of post</h1> 
<% end %> 

<p>Body text</p> 

<% content_for :footer do %> 
    <cite>By Author Name</cite> 
<% end %> 

Luego, en una presentación:

<%= yield :heading %> 
<%= yield %> 
<%= yield :footer %> 

Por supuesto, puede definir aquellos en cualquier orden.

Docs: http://api.rubyonrails.org/classes/ActionView/Helpers/CaptureHelper.html

0

no estoy seguro de si realmente entiendo su pregunta - aquí es un método en el código que funciona:

vista:

<% content_for :one do %> 
    Test one 
<% end %> 

<% content_for :two do %> 
    Test two 
<% end %> 

<p>Hi</p> 

application.html.erb

<%= yield :one %> 
<%= yield %> 
<%= yield :two %> 

Guías de raíl: http://guides.rubyonrails.org/layouts_and_rendering.html#using-content_for

+0

¿Por qué el voto a favor? La pregunta original ha sido editada después de mi respuesta. Contiene muchos más detalles ahora ... –

2

siempre puede pasar el contenido directamente y no depender de un bloque:

<% content_for :replaced_not_appended %> 
11

En los carriles 4, puede pasar el: parámetro ras para anular el contenido.

<%= content_for :block_head, 'hello world', :flush => true %> 

o, si se desea pasar un bloque,

<%= content_for :block_head, :flush => true do %> 
    hello world 
<% end %> 

cf. ayuda de este source code para más detalles

+2

Si NO pasa: flush, también puede usar content_for para agregar múltiples fragmentos en un área. Pero no debe usar <%= yield %>, y usar content_for también para la salida. http://apidock.com/rails/v4.2.1/ActionView/Helpers/CaptureHelper/content_for – Qasim

+0

Parece que es en realidad la respuesta correcta – Gal

Cuestiones relacionadas