4

ブロックヘルパー内にいくつかのヘルパーメソッドを定義したいのですが、わかりやすいメソッド名を付けて見栄えを良くするために、それらをブロックのスコープ内に保持します。

ヘルパーを使用して、次のことを実行したいとします(非常に基本的な例)。

<%= 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
4

1 に答える 1

5

見た目ではcapture、ブロックに引数を渡してはいけません。()のベースへの引数は、 etc。メソッド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。お役に立てれば!

于 2011-01-05T15:09:29.760 に答える