Crie um bloco de escopo no Rails Helper para métodos de escopo adicionais
-
25-09-2019 - |
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
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!