Creare un blocco ambito di rotaie di supporto per i metodi di ambito aggiuntive
-
25-09-2019 - |
Domanda
vorrei definire alcuni metodi di supporto all'interno di un aiutante blocco ma tenerli nell'ambito di applicazione del blocco in modo che io possa avere i nomi dei metodi ragionevoli e sembra più pulito.
Di 'quello che voglio fare quanto segue (un esempio molto semplice), a mio avviso utilizzando aiutanti:
<%= foo_box do |b| %>
<%= b.title( 'Foo Bar' ) %>
Lorem Ipsum...
<% end %>
Per produrre qualcosa di simile
<div class="foo_box">
<h2>Foo Bar</h2>
Lorem Ipsum...
</div>
In questo modo ho potuto anche avere un aiutante blocco bar_box
che potrebbe anche avere un metodo title
che emette qualcosa di totalmente diverso.
Attualmente ho li implementate come metodi diversi, per esempio foo_box
e foo_box_title
, con la gestione del blocco in questo modo foo_box
:
def foo_box(&block)
content_tag(:div, capture(&block), :class => 'foo_box')
end
Soluzione
Con gli sguardi di esso, capture
non consente si passa argomenti nel blocco, che si vuole fare. L'argomento di basso in (b
) deve essere un oggetto di qualche tipo che si definiscono i metodi title
ecc via. Quindi, consente di definire una classe di supporto, che sarà in uscita il materiale è necessario, e passarlo al blocco passata dalla vista, e quindi acquisire e lo circondano nel div
come avete fatto in precedenza. Vorrei fare qualcosa di simile:
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
Vedere come ho ottenuto intorno alla limitazione del metodo capture
? Legando un nuovo Proc all'ambito corrente, e passando l'oggetto helper lì, otteniamo un blocco possiamo chiamare senza argomenti, e quindi accettabile da capture
. Inoltre, rendere la vostra classe di supporto include tutti i metodi di supporto rilevanti ActionView::Helpers
. Spero che questo aiuti!