Ruby on rails 使用“capture”和“concat”比直接在Rails中渲染块有什么好处

Ruby on rails 使用“capture”和“concat”比直接在Rails中渲染块有什么好处,ruby-on-rails,erb,Ruby On Rails,Erb,查看forconcat,下面有人给出了一个如何使用它的示例: def block_to_partial(partial_name, options = {}, &block) options.merge!(:body => capture(&block)) concat(render(:partial => partial_name, :locals => options), block.binding) end 但是如果没有concat,您就不能这样

查看for
concat
,下面有人给出了一个如何使用它的示例:

def block_to_partial(partial_name, options = {}, &block)
  options.merge!(:body => capture(&block))
  concat(render(:partial => partial_name, :locals => options), block.binding)
end

但是如果没有
concat
,您就不能这样做吗?它可以只使用
渲染
对吗?

渲染
只渲染模板-将其写入响应中使用的输出缓冲区

以雇员再培训局为例:

<% render partial: 'foo/bar' %>

因为我们使用的是
,所以Ruby代码的输出只是经过评估。实际上没有任何输出

<%= render partial: 'foo/bar' %>


两者都会将分部的内容添加到响应主体中

使用
concat
的真正好处是当您创建应该直接写入缓冲区的助手方法时


另一方面,用于将块(HTML块)的输出保存到变量中,以便可以在视图中的其他位置使用。

如果您的Rails应用程序使用HAML时需要编写视图帮助程序,则需要
concat
,因为它在您的内脏中。这就是我的经验。请注意,API Dock不是官方的rails文档,通常已经严重过时。我发现它的谷歌排名比官方文档好得多,这让我很恼火。难道我不能用收益率代替捕获吗?^它们做的事情完全不同
yield
为输出布局的一部分或用内容捕获的内容。这里的不同之处在于,您可以使用
capture
将内容作为变量传递,这使得如果您正在创建一个帮助程序,例如转换或增强HTML,那么它非常有用。为什么不使用
options.merge!(:body=>yield(&block))
work?
<% concat(render(partial: 'foo/bar')) %>