我想限定块辅助内的一些辅助方法,但保持它们的块的范围内,这样我可以有合理的方法名,它看起来更清洁。

说我想要做以下的(一个非常基本的例子),我认为使用助手:

<%= foo_box do |b| %>
    <%= b.title( 'Foo Bar' ) %>
    Lorem Ipsum...
<% end %>

要产生像

<div class="foo_box">
   <h2>Foo Bar</h2>
   Lorem Ipsum...
</div>

此方式,我还可以有一个bar_box块辅助其也可以具有其输出完全不同的东西一个title方法。

目前我有他们实现为不同的方法,例如foo_boxfoo_box_title,与foo_box处理像这样的块:

def foo_box(&block)
  content_tag(:div, capture(&block), :class => 'foo_box')
end
有帮助吗?

解决方案

这是它的外观,capture不会让你传递任何参数成块,你想做的事情。在(b)的参数低音必须是某种类型的对象,您定义的title等方法。所以,让我们定义将输出的东西,你需要的一个辅助类,并将其传递给从视图中传递的块,然后抓住它,并围绕着它在div如同上面一样。我会做这样的事情:

class FooBoxHelper
  include ActionView::Helpers::TagHelper  
  def title(text)
    content_tag(:h2, text)
  end
  def small(text)
    content_tag(:p, text, :class => "small")
  end
end

def foo_box(&block)

  new_block = Proc.new do 
    helper = FooBoxHelper.new
    block.call(helper)
  end
  content_tag(:div, capture(&new_block), :class => 'foo_box')
end

看我怎么得到周围的capture方法的局限性?通过结合新PROC到目前的范围,并传入辅助对象那里,我们得到了一个块中,我们可以不带参数调用,从而通过capture接受。此外,请一定助手类包括所有从ActionView::Helpers相关的辅助方法。希望这有助于!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top