问题
In "Agile Web Development with Rails" (third edition) page 537 - 541 it has "Custom Form Builders" code as follows:
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
This code doesn't work with Ruby 1.9.1. It returns error as follows:
implicit argument passing of super from method defined by define_method() is not supported. Specify all arguments explicitly. (ActionView::TemplateError)
My question is: What should I change in the code to fix this?
回答1:
The super
above passed all parameters (see this recent question).
As the error message states, you must here "specify all arguments explicitly". Replace super
with super(label, *args)
.
回答2:
I encountered with this problem in a define_method without arguments
define_method :"#{info_type}_info" do
info = super
.......
end
And still found this problem. I had to explicit put the parenthesis:
define_method :"#{info_type}_info" do
info = super()
.......
end
来源:https://stackoverflow.com/questions/2572322/implicit-argument-passing-of-super-from-method-defined-by-define-method-is-not