我想在块帮助程序中定义一些辅助方法,但是将它们保留在块的范围内,这样我就可以拥有合理的方法名称,并且看起来更清晰。
我想在我的视图中使用帮助程序执行以下操作(一个非常基本的示例):
<%= 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
答案 0 :(得分:5)
从它的外观来看,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
中的所有相关帮助程序方法。希望这有帮助!