Создайте належный блок в рельсы помощника для дополнительных специфицированных методов
-
25-09-2019 - |
Вопрос
Я хотел бы определить некоторые помощники методами в блоке, но держите их в рамках блока, чтобы я мог иметь разумные имена методов, и он выглядит очистителем.
Скажем, я хочу сделать следующий (очень простой пример), на мой взгляд, используя помощников:
<%= 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
. Отказ Надеюсь это поможет!