追加のスコープのメソッドのレールのヘルパーでスコープブロックを作成します。

StackOverflow https://stackoverflow.com/questions/4605087

質問

私は賢明なメソッド名を持つことができるように、ブロックヘルパー内、いくつかのヘルパーメソッドを定義しても、ブロックの範囲内でそれらを維持したいと思いますし、それがきれいに見えます。

と言う私はヘルパーを使用して私の見解では、以下の(非常に基本的な例を)やりたいます:

<%= 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_boxfoo_box_titlefoo_box、ます:

def foo_box(&block)
  content_tag(:div, capture(&block), :class => 'foo_box')
end
役に立ちましたか?

解決

それのルックスでは、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から、関連するすべてのヘルパーメソッドが含まれます。この情報がお役に立てば幸い!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top