Ruby on Rails:提供vs content_for

时间:2015-01-07 07:34:57

标签: ruby-on-rails ruby asset-pipeline content-for

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

  

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

     

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

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

问题2:使用资产管道,效果更好,为什么?

谢谢!

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
                       )
                    ));

根据documentation

  

对于轻量级操作,流式传输可能被视为过度杀伤   喜欢新的或编辑。流媒体的真正好处是昂贵的   例如,对数据库进行大量查询的操作。

因此,如果您不使用流式传输,是否还有差异?

不同之处在于模板可以多次调用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的作用相同,但告诉布局停止搜索其他条目并继续渲染。