在rails helper中创建一个作用域块,以获取其他作用域方法

DEf*_*ion 4 ruby ruby-on-rails block helpers

我想在块帮助器中定义一些辅助方法,但是将它们保持在块的范围内,这样我就可以拥有合理的方法名称,并且看起来更干净.

假设我想在我的视图中使用帮助程序执行以下操作(一个非常基本的示例):

<%= foo_box do |b| %>
    <%= b.title( 'Foo Bar' ) %>
    Lorem Ipsum...
<% end %>
Run Code Online (Sandbox Code Playgroud)

生产类似的东西

<div class="foo_box">
   <h2>Foo Bar</h2>
   Lorem Ipsum...
</div>
Run Code Online (Sandbox Code Playgroud)

这样我也可以有一个bar_box块助手,它也可以有一个title输出完全不同的东西的方法.

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

def foo_box(&block)
  content_tag(:div, capture(&block), :class => 'foo_box')
end
Run Code Online (Sandbox Code Playgroud)

hor*_*irs 5

通过它的外观,capture不允许您将任何参数传递到您想要执行的块中.(b)中的bass的参数必须是某种类型的对象,您可以在其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
Run Code Online (Sandbox Code Playgroud)

看看我如何解决capture方法的局限性?通过将新的Proc绑定到当前作用域,并在那里传递辅助对象,我们得到一个我们可以不带参数调用的块,因此可以接受capture.另外,确保您的帮助程序类包含所有相关的辅助方法ActionView::Helpers.希望这可以帮助!