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
È stato utile?

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!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top