Frage

Ich möchte einige Hilfsmethoden in einem Block Helfer definieren, sondern sie im Rahmen des Blocks zu halten, so dass ich vernünftige Methode Namen haben kann und es sieht sauberer.

will Say du das folgende (ein sehr einfaches Beispiel) zu tun, meiner Meinung nach mit Helfern:

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

Zur Herstellung von so etwas wie

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

So kann ich auch einen bar_box Block Helfer haben könnte, die auch eine title Methode haben könnte, die etwas ganz anderes ausgibt.

Zur Zeit habe ich sie als verschiedene Methoden implementiert, z.B. foo_box und foo_box_title, mit foo_box Umgang mit dem Block in etwa so:

def foo_box(&block)
  content_tag(:div, capture(&block), :class => 'foo_box')
end
War es hilfreich?

Lösung

Mit den Blicken von ihm, capture nicht lassen Sie keine Argumente in den Block übergeben, die Sie tun möchten. Das Argument für Bass in (b) hat eine Aufgabe von einer Art sein, dass Sie die title usw. Methoden zu definieren. So läßt eine Hilfsklasse definieren, die ausgegeben die Dinge, die Sie brauchen, und es mit dem Block in der Ansicht geführt passieren, und dann erfassen und umgeben sie in den div wie Sie oben haben. Ich würde so etwas tun:

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

Sehen Sie, wie ich die Begrenzung der capture Methode dazu gekommen? Durch die Bindung eine neue Proc auf den aktuellen Bereich, und vorbei in das Hilfsobjekt, erhalten wir einen Block wir ohne Argumente aufrufen können und damit akzeptabel capture. Stellen Sie außerdem sicher, dass Ihre Hilfsklasse alle relevanten Hilfsmethoden von ActionView::Helpers enthält. Hoffe, das hilft!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top