不支持从define_method()定义的方法传递super的隐式参数

时间:2010-04-03 19:02:50

标签: ruby-on-rails ruby ruby-1.9 formbuilder

在“使用Rails的敏捷Web开发”(第三版)第537 - 541页中,它具有“自定义表单构建器”代码,如下所示:

  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 个答案:

答案 0 :(得分:17)

上面的super传递了所有参数(请参阅此recent question)。

正如错误消息所述,您必须在此处“明确指定所有参数”。将super替换为super(label, *args)

答案 1 :(得分:13)

我在没有参数的define_method中遇到过这个问题

define_method :"#{info_type}_info" do

  info = super
  .......

end

仍然发现了这个问题。我不得不明确地把括号括起来:

define_method :"#{info_type}_info" do

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

end