Erstellen Sie ein scoped Block in Schienen Helfer für zusätzliche scoped Methoden
-
25-09-2019 - |
Frage
Ich möchte einige Hilfsmethoden in einem Block Helfer definieren, sondern sie im Rahmen des Blocks zu halten, so dass ich vernünftige Methode Namen haben kann und es sieht sauberer.
will Say du das folgende (ein sehr einfaches Beispiel) zu tun, meiner Meinung nach mit Helfern:
<%= foo_box do |b| %>
<%= b.title( 'Foo Bar' ) %>
Lorem Ipsum...
<% end %>
Zur Herstellung von so etwas wie
<div class="foo_box">
<h2>Foo Bar</h2>
Lorem Ipsum...
</div>
So kann ich auch einen bar_box
Block Helfer haben könnte, die auch eine title
Methode haben könnte, die etwas ganz anderes ausgibt.
Zur Zeit habe ich sie als verschiedene Methoden implementiert, z.B. foo_box
und foo_box_title
, mit foo_box
Umgang mit dem Block in etwa so:
def foo_box(&block)
content_tag(:div, capture(&block), :class => 'foo_box')
end
Lösung
Mit den Blicken von ihm, capture
nicht lassen Sie keine Argumente in den Block übergeben, die Sie tun möchten. Das Argument für Bass in (b
) hat eine Aufgabe von einer Art sein, dass Sie die title
usw. Methoden zu definieren. So läßt eine Hilfsklasse definieren, die ausgegeben die Dinge, die Sie brauchen, und es mit dem Block in der Ansicht geführt passieren, und dann erfassen und umgeben sie in den div
wie Sie oben haben. Ich würde so etwas tun:
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
Sehen Sie, wie ich die Begrenzung der capture
Methode dazu gekommen? Durch die Bindung eine neue Proc auf den aktuellen Bereich, und vorbei in das Hilfsobjekt, erhalten wir einen Block wir ohne Argumente aufrufen können und damit akzeptabel capture
. Stellen Sie außerdem sicher, dass Ihre Hilfsklasse alle relevanten Hilfsmethoden von ActionView::Helpers
enthält. Hoffe, das hilft!