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

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

class TaggedBuilder < ActionView::Helpers::FormBuilder # 

#
# #

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}") + "
" + 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)

我的问题是:我应该在代码中更改什么来解决这个问题?

super以上传递了所有参数(参见最近的这个问题 )。

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

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

 define_method :"#{info_type}_info" do info = super ....... end 

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

 define_method :"#{info_type}_info" do info = super() ....... end