2013-04-22 2 views
1

У меня есть пользовательский вид строителя в моем проекте, используя следующий код в инициализаторе:Рубин на Rails пользовательского FormBuilder переопределить text_field

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 

представить определение работы и добавляет класс БТН представить материалы , однако определение text_field не работает, поскольку класс textbox не добавляется к текстовым вводам.

Посмотрев на documentation для FormBuilder я заметил, что представить перечислен как метод, а text_field нет. Мне нужно выяснить, как правильно переопределить метод text_field, используемый при создании форм с использованием form_for. Если это помогает, я использую Ruby 2.0.0 и Rails 3.2.13. Также я посмотрел пример here, который показывает метод text_field в пользовательском классе FormBuilder, поэтому я задаюсь вопросом, был ли этот метод удален в 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 

ответ

0

FormBuilder использует мета-код для создания методов для большинства форм тегов (в том числе text_field). Он заимствует методы экземпляра FormHelper для этой цели, исключая определенные теги, которые требуют другой реализации, и перебирает оставшиеся теги для автоматического создания методов для них. Соответствующий код, создающий генерацию, выглядит следующим образом:

(field_helpers - %w(label check_box radio_button fields_for hidden_field file_field)).each do |selector| 
    class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1 
    def #{selector}(method, options = {}) # def text_field(method, options = {}) 
     @template.send(# @template.send( 
     #{selector.inspect}, # "text_field", 
     @object_name, # @object_name, 
     method, # method, 
     objectify_options(options)) # objectify_options(options)) 
    end # end 
    RUBY_EVAL 
end