1

私のプロジェクトには、初期化子で次のコードを使用するカスタム フォーム ビルダーがあります。

class CustomFormBuilder < ActionView::Helpers::FormBuilder

  def submit(label, *args)
    options = args.extract_options!
    new_class = options[:class] || "btn"
    super(label, *(args << options.merge(:class => new_class)))
  end

  def text_field(label, *args)
    options = args.extract_options!
    new_class = options[:class] || "textbox"
    super(label, *(args << options.merge(:class => new_class)))
  end

end

# Set CustomBuilder as default FormBuilder
ActionView::Base.default_form_builder = CustomFormBuilder

送信定義は機能し、入力を送信するためにクラスbtnを追加しますが、クラスtextboxがテキスト入力に追加されないため、 text_field定義は機能しないようです。

FormBuilder のドキュメントを見た後、 submitがメソッドとしてリストされているのに、text_fieldがリストされていないことに気付きました。私が理解する必要があるのは、 form_for を使用してフォームを生成するときに使用される te​​xt_field メソッドを正しくオーバーライドする方法です。Ruby 2.0.0 と Rails 3.2.13 を使用しています。また、カスタム FormBuilder クラスのtext_fieldメソッドを示す例をここで見たので、Rails 3 でこのメソッドが FormBuilder から削除され、の場所に配置されたのではないかと思います。これを達成する方法についての洞察は大歓迎です。

以下は私の解決策です (PinnyMから提供された情報に基づく)

class CustomFormBuilder < ActionView::Helpers::FormBuilder

  def submit(label, *args)
    options = args.extract_options!
    options[:class] = "btn" if !options[:class].present?
    super(label, *(args << options))
  end

  def self.create_tagged_field(method_name)
    case method_name
    when 'text_field'
      define_method(method_name) do |name, *args|
        options = args.extract_options!
        options[:class] = "textbox" if !options[:class].present?
        super(name, *(args << options))
      end
    end
  end

  field_helpers.each do |name|
    create_tagged_field(name)
  end

end
4

1 に答える 1