Crear un bloque de ámbito en los carriles de ayuda para métodos adicionales con ámbito
-
25-09-2019 - |
Pregunta
Me gustaría definir algunos métodos de ayuda dentro de un ayudante de bloque, pero mantenerlos dentro del ámbito del bloque para que pueda tener los nombres de métodos sensibles y se ve más limpio.
Digamos que quiero hacer lo siguiente (un ejemplo muy básico), en mi opinión el uso de ayudantes:
<%= foo_box do |b| %>
<%= b.title( 'Foo Bar' ) %>
Lorem Ipsum...
<% end %>
Para producir algo así como
<div class="foo_box">
<h2>Foo Bar</h2>
Lorem Ipsum...
</div>
De esta manera también pude tener un ayudante bloque bar_box
que también podría tener un método title
que da salida a algo totalmente diferente.
Actualmente tengo ellos implementan como diferentes métodos, por ejemplo foo_box
y foo_box_title
, con el manejo del bloque como tan foo_box
:
def foo_box(&block)
content_tag(:div, capture(&block), :class => 'foo_box')
end
Solución
Por lo visto, capture
no deja pasar ningún argumento en el bloque, que desea hacer. El argumento para el bajo en (b
) tiene que ser un objeto de algún tipo que se definen los métodos title
etc sucesivamente. Por lo tanto, vamos a definir una clase de ayuda, que dará salida a las cosas que necesita, y pasarlo al bloque transcurrido desde el punto de vista, y luego capturarlo y lo rodean en el div
como lo hizo anteriormente. Me gustaría hacer algo como esto:
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
Vea cómo llegué alrededor de la limitación del método capture
? Al unirse un nuevo Proc al ámbito actual, y que pasa en el objeto ayudante allí, tenemos un bloque que podemos llamar sin argumentos, y por lo tanto aceptable por capture
. También, asegúrese de que su clase de ayuda incluye todos los métodos de ayuda relevantes de ActionView::Helpers
. Espero que esto ayude!