2011-04-12 34 views
6

Ho un grosso blocco di codice HTML nella mia applicazione che vorrei spostare in un modello condiviso e quindi usare content_for con i rendimenti per inserire il contenuto necessario. Tuttavia, se lo uso più volte nello stesso file di layout, il content_for si limita a fare in modo che l'idea non funzioni così bene. c'è una soluzione a questo?Più contenuto_for sulla stessa pagina

<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> 

e utilizzare il seguente codice per impostare il contenuto del blocco

<%= 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" %> 

Il problema è se uso questo più volte sullo stesso layout del contenuto dal blocco originale viene aggiunto al blocco secondario

ho provato a generare un metodo di supporto personalizzato per ottenere intorno ad esso, tuttavia non restituisce alcun contenuto

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

Potrei anche essere completamente sbagliato e se ci sono metodi migliori per far funzionare il contenuto in questo modo mi piacerebbe sapere. Grazie.

risposta

1

Si dovrebbe definire l'overwrite_content_for come il seguente (se ho capito bene la tua domanda):

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 

nota, che nel caso in cui i rendimenti dei blocchi pari a zero, poi il vecchio contenuto viene mantenuta. Tuttavia, l'intera idea non suona bene, dato che ovviamente stai facendo qualche rendering (o almeno una istanziazione dell'oggetto) due volte.

+0

Questo ha fatto il trucco grazie. Capisco il problema del rendering due volte, ma sembra che l'uso di content_for e di layout sia preferibile a quell'incollatura nel grande blocco di HTML ovunque io abbia bisogno di mostrarlo. –

+0

Non puoi scappare con i solitari normali? – Roman

+0

Bene, in alcuni casi sto passando una grande quantità di contenuto HTML nel rendimento block_content. Non sono sicuro di come lo farei con i partial. –

-1

è possibile utilizzare il nome content_for e yield blocchi in questo modo:

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

Poi in un layout:

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

Ovviamente si può definire coloro che in qualsiasi ordine.

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

0

non sono sicuro se ho davvero capito la tua domanda - qui è un approccio nel codice che funziona:

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

Railsguides: http://guides.rubyonrails.org/layouts_and_rendering.html#using-content_for

+0

Perché il downvote? La domanda originale è stata modificata dopo la mia risposta. Contiene molti più dettagli ora ... –

2

Si può sempre e solo passare il contenuto direttamente e non fare affidamento su un blocco:

<% content_for :replaced_not_appended %> 
11

In Rails 4, è possibile passare il: parametro di filo per ignorare il contenuto.

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

o, se si desidera passare un blocco,

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

cf. questo aiutante è source code per ulteriori dettagli

+2

Se NON si passa: flush, è anche possibile utilizzare content_for per aggiungere più frammenti in un'area. Ma non è necessario utilizzare <%= yield %> e utilizzare content_for per l'output. http://apidock.com/rails/v4.2.1/ActionView/Helpers/CaptureHelper/content_for – Qasim

+0

Sembra che sia effettivamente la risposta corretta – Gal

Problemi correlati