Неявная передача аргумента super из метода, определенного define_method (), не поддерживается - PullRequest
12 голосов
/ 03 апреля 2010

На странице " Agile Web Development с Rails " (третье издание) 537 - 541 он имеет следующий код "Custom Form Builders":

  class TaggedBuilder < ActionView::Helpers::FormBuilder
    # <p> # <label for="product_description">Description</label><br/> # <%= form.text_area 'description' %> #</p>
    def self.create_tagged_field(method_name) 
      define_method(method_name) do |label, *args|
        @template.content_tag("p" , @template.content_tag("label" , label.to_s.humanize, 
        :for => "#{@object_name}_#{label}") + "<br/>" + super)
      end
    end
    field_helpers.each do |name| 
      create_tagged_field(name)
    end 
  end

Этот код не работает с Ruby 1.9.1. Возвращает ошибку следующим образом:

implicit argument passing of super from method defined by define_method() is not supported. Specify all arguments explicitly. (ActionView::TemplateError)

Мой вопрос: что я должен изменить в коде, чтобы это исправить?

Ответы [ 2 ]

17 голосов
/ 03 апреля 2010

Выше super переданы все параметры (см. Этот последний вопрос ).

Как говорится в сообщении об ошибке, вы должны здесь "явно указать все аргументы". Заменить super на super(label, *args).

14 голосов
/ 24 ноября 2012

Я столкнулся с этой проблемой в define_method без аргументов

define_method :"#{info_type}_info" do

  info = super
  .......

end

И все же нашел эту проблему. Я должен был явно поставить скобки:

define_method :"#{info_type}_info" do

  info = super()
  .......

end
...