2011-01-05 1 views
3

ブロックヘルパー内にいくつかのヘルパーメソッドを定義したいのですが、ブロックのスコープ内にそれらを保持したいと思います。私もbar_boxを持っている可能性が追加のスコープ付きメソッドのために、rails helperで有効範囲付きブロックを作成してください。

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

のようなものを作るために

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

この方法:

は、私は(非常に基本的な例)以下、私の見解でヘルパーを使用してやりたいと言います完全に異なる何かを出力するtitleメソッドを持つブロックヘルパー。

現在、私はそれらをさまざまな方法で実装しています。 foo_boxfoo_box_title、そうのようなブロックを処理foo_boxで:

def foo_box(&block) 
    content_tag(:div, capture(&block), :class => 'foo_box') 
end 

答えて

4

をその様子では、captureはあなたがやりたいブロックに任意の引数を渡すことはできません。ベース(b)の引数は、titleなどのメソッドを定義するオブジェクトでなければなりません。したがって、あなたが必要とするものを出力するヘルパークラスを定義し、それをビューから渡されたブロックに渡してから、それをキャプチャし、上記のようにdivに囲みます。私は次のようなことをします:

私はcaptureメソッドの限界をどうやって見ましたか?現在のスコープに新しいProcをバインドし、そこにヘルパーオブジェクトを渡すことによって、引数なしで呼び出すことができるブロックが得られ、したがってcaptureで受け入れられます。また、ヘルパークラスには、関連するすべてのヘルパーメソッドが含まれていることを確認してください(ActionView::Helpers)。お役に立てれば!

+0

これは完璧です、ありがとう – DEfusion

関連する問題