2010-01-08 5 views
11

Ich denke, das wurde zuvor gefragt, aber obwohl ich Google durchsucht habe, habe ich keine Lösung gefunden.Rails: mit "content_for" nach dem entsprechenden "yield" innerhalb Layout

So ist das, was ich versuche in Rails zu tun 2.3.5:

layouts/application.html.erb: 
<html> 
    <head> 
    ... some other stuff 
    <%= yield :head %> 
    </head> 
    <body> 
    <% content_for :head, "something that belongs in the head" %> 
    </body> 
</html> 

Hinweis die Ausbeute vor die content_for.

Ich weiß, dass Rails - standardmäßig - nicht erlaubt den Inhalt von: Kopf zu definieren nach Ausbeute wurde verwendet - macht Sinn.

Ich habe sogar versucht, in den Template-Render-Prozess einzuhaken, aber bisher keinen Erfolg.

Also mein Ziel ist es in der Lage zu sein content_for innerhalb von Partials/Templates zu definieren und die "yield" irgendwie verzögert zu bekommen und auszuführen, bevor die Antwort an den Browser gesendet wird.

Hat jemand eine Lösung gefunden?

Gruß und Dank, Frank

aktualisieren ich mit weppos Idee gehe und versuche, mich auf Rack-Middleware. danke

Antwort

13

Der Renderprozess lädt zuerst die Aktionsvorlage und führt sie aus, dann schmückt sie die Vorlage mit dem ausgewählten Layout. Das Layout wird von oben nach unten gerendert, daher können Sie :head keinen weiteren Inhalt hinzufügen, nachdem :head bereits gerendert wurde.

Sie müssen Ihre Strategie ändern. Platzieren Sie das Fragment entweder in eine Teilansicht und hängen Sie es an Ihre Aktionsansichten an, oder verwenden Sie eine Nachbearbeitungsstrategie wie Rack-Modul/after_filter, um den HTML-Code direkt zu ändern.

Ich würde wahrscheinlich versuchen, eine bessere Lösung basierend auf was ich eigentlich brauche zu finden. Wenn dieses Problem auftritt, liegt der Fehler wahrscheinlich an einem anderen Ort, möglicherweise in der App-Architektur.

7

In Ihrer content_for-Anweisung sollte kein Gleichheitszeichen stehen. Es sollte sein:

<% content_for :head, "Something that belongs in the head" %> 

Wenn Sie den Inhalt innerhalb Ihrer Vorlagen und Partials definieren, dann sollte es funktionieren. Diese Technik wurde in Railscast episode 8 behandelt.

Verwandte Themen