0

这是我在 ruby​​ on rails application spree commerce 中找到的一个辅助方法。

我试图更好地理解这里发生了什么,特别是第 12 行的 capture() 方法,这是我以前从未见过的。如果给定了一个块,它就会捕获它,否则就没有内容。但是 capture() 是从哪里来的呢?它在做什么?

 11   def hook(hook_name, locals = {}, &block)
 12     content = block_given? ? capture(&block) : ''
 13     result = Spree::ThemeSupport::Hook.render_hook(hook_name, content, self, locals)
 14     block_given? ? concat(result.to_s) : result
 15   end
4

2 回答 2

3

当您从 ERB 视图中的块中产生时(至少在 rails 1.x 和 2.x 中),它将直接写入缓冲区并因此写入呈现的 html,这可能是不希望的。相反,您可以“捕获”块评估的结果并将其分配给变量,就像他们在此处所做的那样。无论如何,我可能没有像 Ryan Bates 那样解释它:

http://railscasts.com/episodes/40-blocks-in-view

于 2010-07-13T02:36:09.550 回答
1

捕获块允许您从模板文件中获取一个块,对其进行处理并将其存储在一个变量中。

API:http ://api.rubyonrails.org/classes/ActionView/Helpers/CaptureHelper.html#M002300

它在这里发生的事情是,您在模板中的一个块上调用钩子方法,该方法被处理,然后根据 spree 中的主题(基于模块的名称)进行格式化,然后吐出(或成为更技术性,返回)新格式化的块。

于 2010-07-13T02:27:00.513 回答