2013-07-19 5 views
7

Ich teste das content_for in meiner Rails 3.2 App und befolge die Schienen Guides, aber sie sind spezifisch für die tatsächlichen Dateien und ich kann nicht scheinen, um die Ausbeute zu arbeiten:wie content_for verwendet wird, damit der Inhalt im Layout angezeigt wird

application.html.erb Datei:

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

ich eine Layout-Datei _main_nav.html.erb erstellt (ich weiß, ich mit <% machen kann = 'Layout/header' %> machen, aber ich versuche zu benutze stattdessen content_for) Die _main_nav.html.erb ist:

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

<% end %> 

Sie lesen den RailsGuide http://guides.rubyonrails.org/layouts_and_rendering.html#using-the-content-for-method das sollte funktionieren. Aber das tut es nicht. Ich bekomme keinen Fehler. Scheint einfach, aber ich bin ratlos.

Als ich zu meiner index.html.erb Datei gehen würde ich erwarten, um dieses Ergebnis zu sehen:

  • Startseite

Antwort

6

OK, ich denke, ich habe eine Lösung dafür. Ihr Code:

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

sollte am Anfang der Datei sein, die Laden ist. Ihre _header.html.erb ist eine partielle. Wenn Sie diesen Code in views/tasks/new.html.erb verschieben, funktioniert er wie erwartet.

jedoch dafür, wie Sie arbeiten möchten, dann müssen Sie Ihre application.html.erb Datei anzupassen:

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

Hinweis, dass ich das erb-Tag machen, ohne = Zeichen genannt haben. Das bedeutet, dass ich den Inhalt des Headers nicht partiell sehe, aber er lädt. Wenn Sie das Zeichen = einschließen, funktioniert es immer noch, aber es rendert auch jeden anderen Inhalt, den Sie im Teil haben. Hinweis: Das Render-Tag muss über/vor dem Yield-Tag stehen.

+0

Danke @hatStephensWork Ich werde es ausprobieren. – akkdio

+0

keine Sorgen @akkdio, ich habe auch eine Pull-Anfrage an Ihre GitHub Repo. Bei Fragen einfach fragen. Ich bin ein Neuling, aber ich denke ich verstehe, was mit diesem los ist! – HatStephensWork

9

Ich glaube, was Sie haben wollen, ist eine Ansicht, die enthalten Ihr content_for Block. So ein Beispiel wäre, wenn Sie die folgenden Schritte aus:

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> 

Dann ausgeben, was innerhalb des users Sheet wir liefern können und im Symbol des Namens des Passes 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> 

So zu überprüfen, was ist hier passiert das heißt, in meinem Beispiel ich sage ich habe einen users Sheet, das ich in die <head></head> meine Anwendung laden möchte .html.erb. Um dies zu tun, setze ich die content_for, die ein Rails-Helfer ist und geben Sie die Kennung sysmbol, die head ist, die dann in der application.html.erb wo ich yeild :head tun aufgerufen wird. Also, was ich bekomme meine Anwendung zu tun ist, wenn die meine index.html.erb für diese Seite gerendert wird die application.html.erb lädt meine users Stylesheet. Hoffe, das klärt die Dinge für dich auf.

aktualisieren Erklärung

dem Zweck der Kombination der Verwendung von content_for mit yield dieser anderen Sache hinzufügen, ist es, Ihnen zu ermöglichen, Daten in die Anwendung Layout von ANY Ansicht zu injizieren. Also als ein anderes Beispiel. Sie könnten die folgende haben:

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

Hier, wenn die Steuerung der Ansicht Vorlage rendert und kombiniert sie mit dem Anwendungslayout der Text My title wird ersetzt. Die yield(:head) macht es einfach, bei Bedarf weitere Elemente zu der bestimmten Seite hinzuzufügen. Sehen Sie sich das folgende Beispiel an:

app/views/layouts/application.html.erb

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

app/views/blah/index.html.erb

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

Und eine weitere Notiz nicht sicher, wie Sie Ihre Entwicklung Ihrer Anwendung oder welche Design-Framework Ihre verwenden, aber man könnte auch Werfen Sie einen Blick auf Rails-Bootstrap-Navbar. Kann auch eine Alternative sein.

+0

David, Danke. Sie haben Recht, dass mein Beispiel nicht wie das Handbuch war - ich habe es aktualisiert, um genauer zu spezifizieren, was ich zu tun versuche ... Es scheint, dass der content_for-Block überall in den Ansichten aufgerufen werden kann, indem er einfach setzt <% = yield: header%> aber ich kann dieses einfache Beispiel nicht einmal zum Laufen bringen. Ich muss es nicht verstehen oder etwas anderes tun müssen, damit die Dinge erscheinen ... – akkdio

+0

@akkdio siehe aktualisierte Antwort. – David

+0

David, ich weiß es wirklich zu schätzen, dass du dir die Zeit genommen hast, meine Frage zu verstehen, und es tut mir leid, dass es etwas verwirrend war ... Ich sehe, was du getan hast und verstehst es in Bezug auf das Stylesheet. Wo ich nicht klar bin, ist warum, wenn ich versuche, ein nav zu erstellen, um den Inhalt zu verwenden, denn nichts taucht auf? Bitte, wenn du dir mein überarbeitetes Beispiel ansehen kannst und lass es mich wissen, wenn du irgendetwas falsches in meinem Denken verstehst. – akkdio

Verwandte Themen