2010-01-08 2 views
11

Я думаю, что это было задано раньше, но хотя я искал Google, у меня не было решения.Rails: использование «content_for» после соответствующей «yield» внутренней компоновки

Так это то, что я пытаюсь сделать в 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> 

Обратите внимание на выход перед тем content_for.

Я знаю, что Rails - по умолчанию - не разрешает содержание: голова быть определена после урожай был использован - имеет смысл.

Я даже попытался подключиться к процессу визуализации шаблонов, но пока не смог добиться успеха.

Таким образом, моя цель состоит в том, чтобы иметь возможность определять content_for внутри partials/templates и иметь «выход» как-то задерживаемый и выполненный непосредственно перед отправкой ответа в браузер.

Есть ли у кого-нибудь решение?

Привет и спасибо, Frank

Update Я пойду с идеей weppos и попытаться себя на стойке ППО. спасибо

ответ

13

Процесс рендеринга сначала загружает и исполняет шаблон действия, а затем украшает шаблон выбранным макетом. Макет отображается сверху до botton, поэтому вы не можете добавить больше контента в :head после того, как :head уже отображается.

Необходимо изменить вашу стратегию. Либо поместите фрагмент в частичном, либо прикрепите его к вашим представлениям действий или используйте стратегию пост-обработки, такую ​​как модуль Rack/after_filter, чтобы напрямую изменить html-код.

Возможно, я попытаюсь найти лучшее решение, основанное на том, что мне действительно нужно. Если вы столкнулись с этой проблемой, вероятность того, что ошибка будет в другом месте, возможно, в архитектуре приложения.

7

Не должно быть знака равенства в вашем заявлении content_for. Это должно быть:

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

Если вы определяете контент в своих шаблонах и частицах, тогда он должен работать. Этот метод был рассмотрен в Railscast episode 8.