【问题标题】:Understanding this Rails helper理解这个 Rails 助手
【发布时间】:2011-03-15 02:29:41
【问题描述】:

这是我在 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

【问题讨论】:

  • 这是解决uninitialized constant Spree::ThemeSupport问题的方法吗?如果是的话如何实现这个方法以及在哪里写呢?

标签: ruby-on-rails ruby spree


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-09-21
      • 1970-01-01
      • 1970-01-01
      • 2019-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-07
      • 2019-01-22
      相关资源
      最近更新 更多