2010-01-08 4 views
11

Je pense que cela a déjà été demandé, mais même si j'ai cherché sur Google, je n'ai pas trouvé de solution.Rails: en utilisant "content_for" après le "rendement" correspondant mise en page

donc ce que je suis en train de faire dans Rails 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> 

Notez que le rendement avant le content_for.

Je sais que Rails - par défaut - ne permet pas le contenu de: tête à définir après rendement a été utilisé - a un sens.

J'ai même essayé d'accrocher dans le processus de rendu de modèle mais aucun succès jusqu'ici. Donc, mon but est de pouvoir définir le contenu de l'intérieur des partiels/templates et d'avoir le "yield" retardé et exécuté juste avant que la réponse soit envoyée au navigateur.

Est-ce que quelqu'un a trouvé une solution?

Salutations et remerciements, Frank

Mise à jour Je vais aller avec l'idée de weppos et moi-même essayer sur middleware rack. merci

Répondre

13

Le processus de rendu commence par charger et exécuter le modèle d'action, puis décore le modèle avec la disposition sélectionnée. La présentation est rendue de haut en bas, donc vous ne pouvez pas ajouter plus de contenu à :head après :head est déjà rendu.

Vous devez changer de stratégie. Placez le fragment de manière partielle et attachez-le à vos vues d'action ou utilisez une stratégie de post-traitement, telle qu'un module Rack/after_filter, pour modifier directement le code html.

J'essaierais probablement de trouver une meilleure solution basée sur ce dont j'ai réellement besoin. Si vous rencontrez ce problème, les chances sont que l'erreur est ailleurs, peut-être dans l'architecture de l'application.

7

Il ne doit pas y avoir de signe égal dans votre instruction content_for. Il devrait être:

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

Si vous définissez le contenu dans vos modèles et il partials devrait fonctionner. Cette technique a été couverte en Railscast episode 8.

Questions connexes