2010-04-03 24 views
11

Dans « Développement Web Agile avec Rails » (troisième édition) la page 537-541, il a le code « formulaire personnalisé Builders » comme suit:argument implicite qui passe de super de méthode définie par define_method() ne sont pas pris en charge

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 

Ce code ne fonctionne pas avec Ruby 1.9.1. Il renvoie l'erreur comme suit:

implicit argument passing of super from method defined by define_method() is not supported. Specify all arguments explicitly. (ActionView::TemplateError)

Ma question est: Que dois-je changer dans le code pour résoudre ce problème?

Répondre

15

Le super ci-dessus a passé tous les paramètres (voir recent question). Comme le message d'erreur l'indique, vous devez ici "spécifier explicitement tous les arguments". Remplacez super par super(label, *args).

+0

fonctionne maintenant, merci! – jaycode

9

j'ai rencontré ce problème dans un define_method sans arguments

define_method :"#{info_type}_info" do 

    info = super 
    ....... 

end 

Et encore trouvé ce problème. Je devais explicitement mettre la parenthèse:

define_method :"#{info_type}_info" do 

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

end 
+1

qui ressemble à un bug dans l'analyseur de rubis pour moi. vous pourriez soumettre un rapport à l'équipe de base de ruby. Je ne sais pas si c'est quelque chose qu'ils peuvent réparer ou non. exigeant parens ne me ressemble pas rubis. :) –

+3

Cela ne semble pas être un bug. Voir [cette question] (http://stackoverflow.com/questions/2570428/constructor-overriding), et [ce fil de formulaire] (https://www.ruby-forum.com/topic/146693). –