Как я могу использовать yield: content перед content_for в шаблонах Rails? - PullRequest
0 голосов
/ 22 июня 2019

Мне нужно использовать yield / content_for в <head>, но присвоить значение в <body>. Я обнаружил, что это прекрасно работает, когда значение присваивается из шаблона, для которого yield редактируется, но не для шаблона render. Шаблоны, которые render ed, компилируются после <head>, поэтому мое значение уже установлено в камне. Есть ли способ достичь того, что я пытаюсь сделать?

Я попытался сделать application.html.erb следующим образом:

<%= render layout: 'application_template' do %>
  <!-- <body> content here -->
<% end %>

и _application_template.html.erb выглядят так:

<!doctype>
<html>
  <head>
    <%= content_for :my_value %>
  </head>
  <body>
    <%= yield %>
  </body
</html>

, но возникает та же проблема, при рендеринге _application_template.html.erb значение равно nil.

Ответы [ 2 ]

0 голосов
/ 22 июня 2019

Я нашел решение.

# layouts/application.html.erb

<% content_for(:body_content) { render partial: 'layouts/body_content' } %>

<!doctype html>
<html>
  <head>
    <%= yield :my_value if content_for?(:my_value) %>
  </head>
  <body>
    <%= yield :body_content %>
  </body>
</html>

и

# layouts/_body_content.html.erb

# everything that used to be in <body></body> goes here and is maintained here.

Это гарантирует, что все вызовы #content_for, которые мне нужны, произойдут до того, как <head> будет скомпилировано в моем макете. Его также легче поддерживать, чем некоторые другие хаки, которые я когда-либо пытался попробовать.

0 голосов
/ 22 июня 2019

Вы должны быть в состоянии сделать следующее.В вашей голове проверьте, есть ли какой-либо контент, который нужно выдавать, и дайте его, если он есть.

    <% if content_for?(:my_value) %>
      <%= yield :my_value %>
    <% else %>

А затем определите свой контент где-нибудь в своем теле.

    <% content_for :my_value do %>
      # your contents
    <% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...