16

Railsを使用したアジャイルWeb開発」(第3版)の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

このコードはRuby1.9.1では機能しません。次のようにエラーが返されます。

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

私の質問は次のとおりです。これを修正するには、コードを何に変更する必要がありますか?

4

2 に答える 2

21

上記superはすべてのパラメーターを渡しました(この最近の質問を参照してください)。

エラーメッセージに示されているように、ここでは「すべての引数を明示的に指定する」必要があります。に置き換えsuperますsuper(label, *args)

于 2010-04-03T19:47:50.210 に答える
17

引数なしのdefine_methodでこの問題が発生しました

define_method :"#{info_type}_info" do

  info = super
  .......

end

そして、まだこの問題を見つけました。かっこを明示的に入れなければなりませんでした:

define_method :"#{info_type}_info" do

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

end
于 2012-11-24T18:43:49.740 に答える