Создайте належный блок в рельсы помощника для дополнительных специфицированных методов

StackOverflow https://stackoverflow.com/questions/4605087

Вопрос

Я хотел бы определить некоторые помощники методами в блоке, но держите их в рамках блока, чтобы я мог иметь разумные имена методов, и он выглядит очистителем.

Скажем, я хочу сделать следующий (очень простой пример), на мой взгляд, используя помощников:

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

Производить что-то вроде

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

Таким образом, я мог бы также иметь bar_box Блокировать помощник, который также может иметь title Метод, который выводит что-то совершенно другое.

В настоящее время у меня есть их реализованные как разные методы, например foo_box а также foo_box_title, с участием foo_box Обработка блока, как так:

def foo_box(&block)
  content_tag(:div, capture(&block), :class => 'foo_box')
end
Это было полезно?

Решение

По внешности это, capture Не позволяет передавать какие-либо аргументы в блок, который вы хотите сделать. Аргумент на бас в (b) должен быть объектом какой-то, что вы определяете title и т.д. Методы на. Итак, давайте определим класс помощника, который выводит нужный материал, и пропустите его в блок, переданный с вида, а затем захватить его и окружать его в div Как вы сделали выше. Я бы сделал что-то вроде этого:

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

Посмотрите, как я получил ограничение capture Метод? Привязывая новый PREC в текущую область и прохождение в хелперском объекте там, мы получаем блок, который мы не можем позвонить без аргументов, и, таким образом, приемлемым capture. Отказ Также убедитесь, что ваш помощник класс включает в себя все соответствующие методы помощника от ActionView::Helpers. Отказ Надеюсь это поможет!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top