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
¿Fue útil?

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!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top