как захватить блок в дочернем классе помощника? - PullRequest
16 голосов
/ 27 августа 2011

Я пытаюсь сделать следующее:

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)

с номером белья для вызова capture(&block).

Как использоватьcapture внутри собственного класса помощника?

1 Ответ

13 голосов
/ 28 августа 2011

Я бы сделал что-то вроде этого:

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=' вместо той, которую вы упоминаете. Я не смог воспроизвести вашу.

...