Ruby on Rails:提供vs content_for

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

提供(name,content = nil,&block)

与content_for相同,但与流式传输一起使用时直接返回布局。 换句话说,如果要在呈现给定模板时多次连接到同一缓冲区,则应使用content_for,否则,使用provide来告诉布局停止查找更多内容。

问题1:这对我来说是非常抽象的 – 有人可以通过给出一个示范性的例子来充实它吗?

问题2:使用资产管道,其表现更好,为什么?

谢谢!

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

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

class MyController def action render stream: true # Streaming enabled end end 

根据文件 :

对于像new或edit这样的轻量级操作,Streaming可能被认为是过度杀伤。 流式传输的真正好处在于昂贵的操作,例如,对数据库进行大量查询。

那么,如果你不使用流媒体,还有差别吗?

是。

不同之处在于模板可以通过多次调用content_for来定义多个内容块 。 这样做会连接块并将其传递给布局:

 # layout.html.erb 
<%= yield :surprise %>

<%= yield %>

But it's not very interesting...

# template.html.erb <%= content_for :surprise, "Hello" %> I've got your content! <%= content_for :surprise, ", World!" %> # Generated HTML
Hello, World!

I've got your content!

But it's not very interesting...

由于provide 不会继续搜索提供的模板,因此只有传递给第一个provide调用的块才会被发送到模板:

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

好奇地看到差异是什么,并且正如Thong Kuah指出api,在答案中:

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