Rails: использование «content_for» после соответствующего «yield» внутри макета - PullRequest
11 голосов
/ 08 января 2010

Я думаю, об этом уже спрашивали, но, хотя я искал в Google, я не нашел решения.

Вот что я пытаюсь сделать в 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 - по умолчанию - не позволяет определять содержание: head после использования yield - имеет смысл.

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

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

Кто-нибудь придумал решение?

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

Обновление Я пойду с идеей Веппо и попробую себя на промежуточном программном обеспечении. спасибо

Ответы [ 2 ]

13 голосов
/ 08 января 2010

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

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

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

7 голосов
/ 08 января 2010

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

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

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

...