追加のスコープのメソッドのレールのヘルパーでスコープブロックを作成します。
-
25-09-2019 - |
質問
私は賢明なメソッド名を持つことができるように、ブロックヘルパー内、いくつかのヘルパーメソッドを定義しても、ブロックの範囲内でそれらを維持したいと思いますし、それがきれいに見えます。
と言う私はヘルパーを使用して私の見解では、以下の(非常に基本的な例を)やりたいます:
<%= 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
解決
それのルックスでは、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
から、関連するすべてのヘルパーメソッドが含まれます。この情報がお役に立てば幸い!
所属していません StackOverflow