2013-07-19 14 views
7

Sto testando il content_for nella mia app per rails 3.2 e seguendo le guide dei binari ma sono specifici dei file effettivi e non riesco a far funzionare la resa:come usare content_for in modo che il contenuto si presenti nel layout

file di

application.html.erb:

<!DOCTYPE html> 
<html> 
<head> 
... 
</head> 

<body> 




<%= yield :navigation %> #shouldn't this load the content_for block named :navigation specified in the _main_nav.html.erb partial? 

<%= yield %> #this load the index page content 


</body> 
</html> 

ho creato un file di layout _main_nav.html.erb (so di poter rendere con <% = rendere 'layout/intestazione' %>, ma sto cercando di utilizzare invece il content_for) Il _main_nav.html.erb è il seguente:

Loro hanno letto la RailsGuide http://guides.rubyonrails.org/layouts_and_rendering.html#using-the-content-for-method questo dovrebbe funzionare. Ma non è così. Non ho un errore Sembra semplice ma sono perplesso.

Quando vado al mio file index.html.erb mi sarei aspettato di vedere questo risultato:

  • casa

risposta

6

OK, penso di avere una soluzione per questo. Il tuo codice:

<% content_for :navigation do %> 
<ul> 
<li>Home</li> 
</ul> 
<% end %> 

dovrebbe essere nella parte superiore del file che è carico. Il tuo _header.html.erb è parziale. Se sposti questo codice in views/tasks/new.html.erb, allora funziona come previsto.

Tuttavia, per farlo funzionare come si desidera, allora è necessario regolare il file application.html.erb:

<p>this is where we should see the "Home" link appear that is defined in _header.html.erb:</p> 
<section class="header"> 
<% render 'layouts/header' %> 
<%= yield :navigation %> 
</section> 

Avviso, che ho chiamato il tag erb senza il segno = il rendering. Ciò significa che non vedo il contenuto dell'intestazione parziale, ma viene caricato. Se includi il segno =, allora funziona ancora, ma rende anche qualsiasi altro contenuto che potresti avere nel partial. Nota: il tag di rendering deve essere sopra/prima del tag yield.

+0

Grazie a @hatStephensWork, lo proverò. – akkdio

+0

no worries @akkdio, ho anche fatto una richiesta pull al tuo repository GitHub. Qualsiasi domanda basta chiedere. Sono un principiante, ma penso di capire cosa sta succedendo con questo! – HatStephensWork

9

Credo che ciò che si desidera avere è avere una vista che conterrà il tuo blocco content_for. Quindi, un esempio potrebbe essere se avete la seguente:

index.html.erb

<% content_for :head do %> 
    <%= stylesheet_link_tag 'users' %> 
    #Above this will load the users stylesheet 
<% end %> 

<h2>Example</h2> 
    <ul> 
    <% @users.each do |users| %> 
     <li><%= user.name %></li> 
    <% end %> 
    </ul> 

Poi all'uscita ciò che all'interno del foglio di stile users possiamo cedere e passare il simbolo del nome del content_for.

application.html.erb

<!-DOCTYPE html> 
     <html> 
     <head> 
     <%= yield :head%> 
      <title>This is my title</title 
     </head> 
     <body> 
     <p>This is a test</p> 
     <%= yield %> 
    </html> 

Quindi, per rivedere quello che accade qui è che, nel mio esempio lo dico ho un users foglio di stile che vorrei caricare nel <head></head> della mia applicazione .html.erb. Per fare questo ho impostato il content_for che è un helper di Rails e dargli l'identificatore sysmbol che è head che viene poi chiamato nel application.html.erb dove faccio yeild :head. Quindi quello che sto cercando di fare è quando il mio index.html.erb per quella pagina viene reso il application.html.erb caricherà il mio foglio di stile users. Spero che questo chiarisca le cose per te.

Aggiornamento spiegazione

Per aggiungere a questo un'altra cosa lo scopo della combinazione di utilizzare content_for con yield è quello di consentire di iniettare i dati nel layout applicazione dal QUALSIASI vista. Quindi, come un altro esempio. Si potrebbe avere il seguente:

<% content_for :title do %> My Title<% end %> 

Qui quando il controllore rende il modello di vista e li combina con il layout dell'applicazione, il testo My title sarà sostituito. Lo yield(:head) semplifica l'aggiunta di più elementi alla pagina specifica, se necessario. Dai un'occhiata al seguente esempio:

app/views/layouts/application.html.erb

<% if content_for?(:navbar) %> 
    <%= yield(:navbar) %> 
<% else %> 
    <%# default navbar %> 
    <section class="navbar"></section> 
<% end %> 

app/views/bla/index.html.erb

<% content_for(:navbar) do %> 
    <section class="navbar"></section> 
<% end %> 

E un ulteriore nota non sicuro di come il vostro sviluppo dell'applicazione o che cosa quadro di progettazione utilizzando il vostro, ma si potrebbe anche dai un'occhiata a Rails-Bootstrap-Navbar. Potrebbe anche essere un'alternativa.

+0

David, Grazie. Hai ragione nel dire che il mio esempio non era come la guida: l'ho aggiornato per essere più specifico su ciò che sto cercando di fare ... Sembra che il blocco content_for debba essere chiamato per essere chiamato ovunque nelle viste semplicemente mettendo <% = yield: header%> tuttavia non riesco nemmeno a far funzionare questo semplice esempio. Non devo capirlo o devo fare qualcos'altro per far apparire le cose ... – akkdio

+0

@akkdio guarda la risposta aggiornata. – David

+0

David, apprezzo molto che vi porterà il tempo di capire la mia domanda e dispiace che era un po 'di confusione ... Vedo ciò che avete fatto e capire come si riferisce al foglio di stile. Dove non sono chiaro è il motivo per cui quando provo a creare un nav per usare il content_for compare nulla? Per favore, se riesci a guardare il mio esempio rielaborato e fammi sapere se trovi qualcosa di sbagliato nel mio modo di pensare. – akkdio