不支持从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