2011-04-04 3 views
12

私はレール2のいくつかのヘルパーにこのパターンを使用しましたが、レール3で同じように動作していません。私の目標は、内部にネストされたコンテンツを持つヘルパーメソッドをいくつか生成させることです。ここで私が取得しようとしているものの基本的な例です。ヘルパーメソッドはレール3のブロックにどのようにして収穫されますか?

レール2に
<div class="box"> 
    my content 
</div> 

私はこのようにそれを行う:

私のレイアウトファイル内に、私はヘルパーメソッドを呼び出す:

<% box_wrapper do %> 
    <%= yield -%> 
    <% end %> 

ヘルパーメソッドは次のように定義されています。

def box_wrapper 
    concat <<-EOF.html_safe 
    <div class="box"> 
    EOF 

    yield if block_given? 
    concat <<-EOF.html_safe 
    </div> 
    EOF 
end 

しかし、レール3の

は、ビューがレンダリングされるとき、それは私のページ全体のANを出力dを入力すると、 box_wrapperの内部ですべてのページコンテンツが2回目のレンダリングされます。

私はヘルパーと利回りを使い方が分かりません。何か案は?

答えて

31

Rails 3では、ブロックのコンテンツを構築するために、concatメソッドを使用する必要がなくなりました。

あなたのヘルパーは次のようになります。

def box_wrapper(&block) 
    content = capture(&block) 
    content_tag(:div, content, :class => 'box') 
end 

あなたはRailscasts 208の他の例を見ることができます。

+1

R. Batesの推薦を転送するだけです: "UPDATE:" with_output_buffer "の代わりに" capture "メソッドを使うことをお勧めします。これはERBビューの外で働くという利点があります。 – apneadiving

+0

@apneadiving - ありがとう、間違いなく改良。 –

+0

ありがとう!私の本当の使い方は普通のcontent_tagよりも複雑ですが、それは私を始めさせるのに十分でした。 – nimblegorilla

関連する問題