Как захватить блок в дочернем классе помощника?
Я пытаюсь сделать следующее:
module ApplicationHelper
class PModuleHelper
include ActionView::Helpers::TagHelper
def heading(head = "", &block)
content = block_given? ? capture(&block) : head.to_s
content_tag :h3, content, :class => :module_header
end
end
def getmh
PModuleHelper.new
end
end
Либо укажите строку (или символ) методу heading
, либо блок.
В представлении:
<% mh = getmh %>
<%= mh.heading :bla %> // WORKS
<%= mh.heading do %> // FAILS
test 123
<% end %>
(обратите внимание, что getmh
только для этого примера, PModuleHelper
возвращается другим процессом в моем приложении, поэтому нет необходимости комментировать это или предлагать сделать heading
обычный вспомогательный метод, а не класс-метод)
К сожалению, я всегда получаю следующую ошибку:
wrong number of arguments (0 for 1)
с номером linenumber для вызова capture(&block)
.
Как использовать capture
внутри собственного класса-помощника?
Ответы
Ответ 1
Я бы сделал что-то вроде этого:
module Applicationhelper
class PModuleHelper
attr_accessor :parent
def initialize(parent)
self.parent = parent
end
delegate :capture, :content_tag, :to => :parent
def heading(head = "", &block)
content = block_given? ? capture(&block) : head.to_s
content_tag :h3, content, :class => :module_header
end
end
def getmh
PModuleHelper.new(self)
end
end
Я не могу гарантировать, что это сработает, потому что у меня была эта ошибка: undefined method 'output_buffer='
вместо той, которую вы упоминаете. Я не смог воспроизвести ваши.