28

我今天遇到了视图助手功能“提供”。通过查看它的手册,我仍然对它与“content_for”有何不同感到困惑。

提供(名称,内容 = nil,&block)

与 content_for 相同,但与流一起使用时会直接刷新回布局。换句话说,如果你想在渲染给定模板时多次连接到同一个缓冲区,你应该使用 content_for,如果没有,使用 provide 告诉布局停止寻找更多内容。

问题 1:这对我来说很抽象 - 任何人都可以通过举例说明来充实它吗?

问题 2:使用资产管道,哪个性能更好,为什么?

谢谢!

4

2 回答 2

27

首先,什么是流媒体?你为什么要使用它?

流式传输是自上而下(由外而内)呈现页面的替代方法。默认呈现行为是由内而外的。必须在您的控制器中启用流式传输:

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调用的块将被发送到模板:

# layout.html.erb
<div class="heading"><%= yield :title %></div>

# template.html.erb
<%= provide :title, "Foo" %>
<%= provide :title, "bar" %>

# Generated HTML
<div class="heading">Foo</div>
于 2015-09-24T16:13:01.627 回答
7

很想知道有什么区别,当Thong Kuah指着 api 时,答案里面:

这意味着,如果您的布局中有 yield :title 并且您想使用流式传输,则必须在流式传输标题和所有资产之前渲染整个模板(并最终触发所有查询),这会破坏流式传输的目的。出于这个原因,Rails 3.1 引入了一个名为 provide 的新助手,它的作用与 content_for 相同,但告诉布局停止搜索其他条目并继续呈现。

于 2015-05-05T10:57:24.577 回答