2010-04-03 5 views
11

В «Agile Web Development с Rails» (третье издание), стр 537 - 541 имеет «настраиваемую форму строителей» код следующим образом:неявный аргумент прохождения супер от метода, определенного define_method() не поддерживается

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)

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

ответ

15

super выше переданные все параметры (см. Это recent question).

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

+0

Работая сейчас, спасибо! – jaycode

9

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

define_method :"#{info_type}_info" do 

    info = super 
    ....... 

end 

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

define_method :"#{info_type}_info" do 

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

end 
+1

, который выглядит как ошибка в рубиновом парсере для меня. вы можете отправить отчет группе рубинов. не уверен, что это то, что они могут исправить или нет. для меня это не похоже на руны. :) –

+3

Это не похоже на ошибку. См. [Этот вопрос] (http://stackoverflow.com/questions/2570428/constructor-overriding) и [этот поток формы] (https://www.ruby-forum.com/topic/146693). –

 Смежные вопросы

  • Нет связанных вопросов^_^