Question

Je tiens à définir des méthodes d'aide au sein d'un bloc helper mais de les garder dans le champ d'application de la bloquer afin que je puisse avoir judicieux des noms de méthode et il a l'air plus propre.

Dire que je veux faire ce qui suit (un exemple de base), de mon point de vue à l'aide des assistants:

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

Pour produire quelque chose comme

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

De cette façon, je pourrais aussi avoir un bar_box bloc helper qui pourrait aussi avoir un title méthode qui affiche quelque chose de totalement différent.

Actuellement, j'ai mis en œuvre comme autant de méthodes différentes, par exemple foo_box et foo_box_title, avec foo_box la manipulation du bloc comme ceci:

def foo_box(&block)
  content_tag(:div, capture(&block), :class => 'foo_box')
end
Était-ce utile?

La solution

Par les regards de celui-ci, capture ne les laissez pas vous passer des arguments dans le bloc, qui que vous voulez faire.L'argument de la basse dans (b) doit être un objet de quelque sorte que vous définissez la title etc.méthodes sur.Donc, permet de définir une classe d'assistance qui sera de sortie le truc que vous avez besoin, et de le transmettre au bloc transmis à partir de la vue, puis le capturer et de l'entourer dans la div comme vous l'avez fait ci-dessus.Je voudrais faire quelque chose comme ceci:

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

Voir comment j'ai obtenu autour de la limitation de la capture méthode?En liant un nouveau Proc du champ d'application actuel, et en lui passant l'objet d'assistance, nous arrivons à un bloc, nous pouvons l'appeler sans arguments, et donc acceptable par capture.Aussi, assurez-vous votre assistant classe comprend toutes les méthodes d'assistance de ActionView::Helpers.Espérons que cette aide!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top