【发布时间】:2018-08-26 18:00:10
【问题描述】:
非工作代码:
# application.html.erb, BASE layout
<html>
<head>
<body>
<%= yield %>
</body>
</head>
</html>
# _pwa.html.erb, SPECIFIC layout
<div class="container">
<%= yield :main_content %>
</div>
# _partial.html.erb, ACTUAL body
<% content_for :main_content do %>
<h1>Test</h1>
<% end %>
# view.html.erb, actual view file that links everything together
<%= render layout: "layouts/pwa" do %>
<%= render "partial" %>
<% end %>
当view.html.erb 被控制器渲染时,我希望输出的 html 文件看起来像这样:
<html>
<head>
<body>
<div class="container">
<h1>Test</h1>
</div>
</body>
</head>
</html>
但<h1>Test</h1> 实际上并不存在。另一方面,如果我删除命名的产量,并用常规产量替换,它确实有效。即,下面的代码确实生成了上面的正确输出:
工作代码:
# application.html.erb, BASE layout
<html>
<head>
<body>
<%= yield %>
</body>
</head>
</html>
# _pwa.html.erb, SPECIFIC layout
<div class="container">
<%= yield %>
</div>
# _partial.html.erb, ACTUAL body
<h1>Test</h1>
# view.html.erb, actual view file that links everything together
<%= render layout: "layouts/pwa" do %>
<%= render "partial" %>
<% end %>
但我确实想弄清楚如何让命名区域工作,因为实际的 pwa 布局有点复杂,我想做如下的事情:
# _pwa.html.erb
<div class="container">
<%= yield :main_content %>
</div>
<div class="container">
<%= yield :secondary_content %>
</div>
# _partial.html.erb
<% content_for :main_content do %>
<h1>Test</h1>
<% end %>
<% content_for :secondary_content do %>
<h2>Second</h2>
<% end %>
编辑,我实际上有一个像这样的迭代器:
<%= render layout: "layouts/pwa" do %>
<% @pages.each do |p| %>
<%= render "partial/#{p}" %>
<% end %>
<% end %>
【问题讨论】:
-
确保 content_for 对象在调用之前被创建。
-
更改位置 yield 和 content_for
-
谢谢!不知道你们是什么意思,
content_for和yield所以不知道如何进行任何位置更改以确保在yield之前创建content_for对象 -
@james,试试这个:
render partial: 'partial', layout: 'layouts/pwa' -
啊,好吧,我这里有一些隐藏的上下文,我实际上有一个迭代器(见上面的编辑),这就是为什么我真的不想那样做,因为那样布局被多次渲染。 @fongfan999 我想知道为什么命名的收益不起作用,但非命名的收益确实有效?
标签: ruby-on-rails view rendering yield