私のプロジェクトには、初期化子で次のコードを使用するカスタム フォーム ビルダーがあります。
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 を使用してフォームを生成するときに使用される text_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