创建轨帮手额外范围的方法作用域块
-
25-09-2019 - |
题
我想限定块辅助内的一些辅助方法,但保持它们的块的范围内,这样我可以有合理的方法名,它看起来更清洁。
说我想要做以下的(一个非常基本的例子),我认为使用助手:
<%= 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_box
和foo_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
相关的辅助方法。希望这有助于!
不隶属于 StackOverflow