Pergunta

Gostaria de definir alguns métodos auxiliares dentro de um ajudante de bloco, mas mantê -los dentro do escopo do bloco, para que eu possa ter nomes de métodos sensíveis e pareça mais limpo.

Digamos que eu queira fazer o seguinte (um exemplo muito básico), na minha opinião usando ajudantes:

<%= foo_box do |b| %>
    <%= b.title( 'Foo Bar' ) %>
    Lorem Ipsum...
<% end %>

Para produzir algo como

<div class="foo_box">
   <h2>Foo Bar</h2>
   Lorem Ipsum...
</div>

Dessa forma, eu também poderia ter um bar_box Bloqueio auxiliar que também poderia ter um title Método que gera algo totalmente diferente.

Atualmente eu os implementei como métodos diferentes, por exemplo foo_box e foo_box_title, com foo_box manuseando o bloco como assim:

def foo_box(&block)
  content_tag(:div, capture(&block), :class => 'foo_box')
end
Foi útil?

Solução

Pela aparência disso, capture Não permite que você passe nenhum argumento para o bloco, o que você deseja fazer. O argumento para baixo em (b) tem que ser um objeto de algum tipo que você defina title etc. métodos em. Então, vamos definir uma classe auxiliar que produzirá as coisas de que você precisa e passará para o bloco passada da vista e depois capturá -lo e cercá -lo no div Como você fez acima. Eu faria algo assim:

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

Veja como eu fiquei em torno da limitação do capture método? Ao vincular um novo Proc ao escopo atual e passar no objeto auxiliar lá, recebemos um bloco que podemos chamar sem argumentos e, portanto, aceitável por capture. Além disso, certifique -se de que sua classe ajudante inclua todos os métodos auxiliares relevantes de ActionView::Helpers. Espero que isto ajude!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top