使用`capture`和`concat`比在Rails中直接渲染块有什么好处

时间:2017-03-27 21:35:44

标签: ruby-on-rails erb

查看concat的{​​{3}},有人举例说明如何使用它:

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对吧?

一起使用

1 个答案:

答案 0 :(得分:1)

render只需呈现模板 - concat将其写入响应中使用的输出缓冲区。

以此ERB为例:

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

由于我们使用<% %>,因此只评估Ruby代码的输出。实际上没有输出。

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

并且

<% concat(render(partial: 'foo/bar')) %>

两者都将部分内容添加到响应主体。

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

另一方面,

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