我今天遇到了视图助手功能“提供”。通过查看其手册,我仍然对它与“content_for”的区别感到困惑。
提供(name,content = nil,& block)
与content_for相同,但与流媒体直接使用时相同 回到布局。换句话说,如果你想连接几个 你应该在渲染给定模板时到同一个缓冲区的时间 使用content_for,如果没有,请使用provide来告诉布局停止 寻找更多内容。
问题1:这对我来说是非常抽象的 - 有人可以通过给出一个示范性的例子来充实它吗?
问题2:使用资产管道,效果更好,为什么?
谢谢!
答案 0 :(得分:25)
首先,什么是流媒体?你为什么要用它?
Streaming是自上而下(从外向内)呈现页面的替代方法。默认呈现行为是由内而外的。必须在控制器中启用流式传输:
var content = new XElement("GAME",
new XElement("EVENTS",
from e in AllEvents
select new XElement("EVENT",
new XELement("eventID", e.eventId),
new XElement("eventDescription", e.eventDescription),
new XElement("hasEventOccured", e.hasEventOccured)
)
),
new XElement("OBJECTS",
from obj in AllObjects
select new XElement("OBJECT",
// make content for a single object
)
));
对于轻量级操作,流式传输可能被视为过度杀伤 喜欢新的或编辑。流媒体的真正好处是昂贵的 例如,对数据库进行大量查询的操作。
因此,如果您不使用流式传输,是否还有差异?
是
不同之处在于模板可以多次调用class MyController
def action
render stream: true # Streaming enabled
end
end
来定义多个内容块。这样做会连接块并将其传递给布局:
content_for
由于# layout.html.erb
<div class="heading"><%= yield :surprise %></div>
<div class="body">
<p><%= yield %></p>
<p>But it's not very interesting...</p>
</div>
# template.html.erb
<%= content_for :surprise, "Hello" %>
I've got your content!
<%= content_for :surprise, ", World!" %>
# Generated HTML
<div class="heading">Hello, World!</div>
<div class="body">
<p>I've got your content!</p>
<p>But it's not very interesting...</p>
</div>
没有继续搜索提供的模板,只有传递给第一个provide
来电的广告块才会被发送到模板:
provide
答案 1 :(得分:6)
很想知道差异是什么,并且Thong Kuah指向api,答案内部:
这意味着,如果您的布局中有yield:title并且您想要使用流式传输,那么在流式传输标题和所有资产之前,您必须渲染整个模板(并最终触发所有查询),从而杀死目的流媒体出于这个原因,Rails 3.1引入了一个名为provide的新助手,它与content_for的作用相同,但告诉布局停止搜索其他条目并继续渲染。