【问题标题】:How does a helper method yield to a block in rails 3?辅助方法如何产生 Rails 3 中的块?
【发布时间】:2011-04-04 15:25:35
【问题描述】:

我已经在 rails 2 中的许多助手中使用了这种模式,但在 rails 3 中它的工作方式不同。我的目标是让助手方法生成一些包含嵌套内容的 html 标记。这是我想要得到的一个基本示例:

<div class="box">
  my content
</div>

在 Rails 2 中,我这样做:

在我的布局文件中,我调用了辅助方法:

  <% box_wrapper do %>
    <%= yield -%>
  <% end %>

帮助方法定义如下:

def box_wrapper
  concat <<-EOF.html_safe
    <div class="box">
  EOF

  yield  if block_given?
  concat <<-EOF.html_safe
    </div>
  EOF
end

但是在 rails 3 中,当视图被渲染时,它会输出我的整个页面,然后在 box_wrapper 内它会第二次渲染所有页面内容。

我认为我在如何使用助手和产量方面遗漏了一些明显的东西。有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3


    【解决方案1】:

    在 Rails 3 中,您不再需要使用 concat 方法来构建块的内容。

    您的助手现在看起来像这样:

    def box_wrapper(&block)  
      content = capture(&block)  
      content_tag(:div, content, :class => 'box')  
    end
    

    您可以在Railscasts 208 中查看其他示例。

    【讨论】:

    • 只是转发 R. Bates 的建议:“更新:我建议使用“捕获”方法而不是“with_output_buffer”。这具有在 ERB 视图之外工作的额外好处。下面的代码已经更新了。”
    • @apneadiving - 谢谢你,绝对是一个进步。
    • 谢谢!我的实际使用比普通的 content_tag 更复杂,但这足以让我开始。
    • @DouglasFShearer 只是想知道为什么需要调用capture(&amp;block) 而不是yieldyield 实际上最终会渲染视图直到那个点。
    • @Dex 也想知道这一点,但似乎 yield 有时不会......在这种情况下产生正确的结果。 capture 是要走的路。这很奇怪,因为我在两个助手中有类似的用例——在第一个中我使用了yield,但在另一个中这不起作用,我需要使用capture
    猜你喜欢
    • 2016-11-25
    • 2011-07-28
    • 2011-11-19
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 2016-07-22
    相关资源
    最近更新 更多