在Rails模板中,如何在content_for之前使用yield:content?

时间:2019-06-22 05:52:38

标签: ruby-on-rails

我需要在BOOL SetWindowDisplayAffinity(HWND hWnd,DWORD dwAffinity); 中使用yield / content_for,但要在<head>中分配值。我发现,当从正在<body>的模板中分配值,而不是从yield的模板中分配值时,这很好用。 render之后正在编译的模板在render>之后进行编译,因此我的价值已经确定了。有什么方法可以实现我的目标?

我试图使application.html.erb看起来像这样:

<head

<%= 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> 时该值为nil。

2 个答案:

答案 0 :(得分:0)

您应该能够执行以下操作。 在脑海中检查是否有任何要屈服的内容,如果有则屈服。

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

然后在体内的某个位置定义内容。

    <% content_for :my_value do %>
      # your contents
    <% end %>

答案 1 :(得分:0)

我想出了一个解决办法。

# 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>被编译到布局中之前发生。相比我想尝试的其他一些技巧,维护起来也更容易。