2013-08-16 2 views
0

Я хотел бы добавить вспомогательный элемент формы number_field, который существует в rails 3 для моего rails 2.3.15, но у меня проблемы с расширением модуля.Добавление рельсов 3 формы помощников в рельсы 2

Эти методы мне нужно с рельсов 3

class InstanceTag 
    def to_number_field_tag(field_type, options = {}) 
     options = options.stringify_keys 
     if range = options.delete("in") || options.delete("within") 
      options.update("min" => range.min, "max" => range.max) 
     end 
     to_input_field_tag(field_type, options) 
     end 
end 

def number_field(object_name, method, options = {}) 
     InstanceTag.new(object_name, method, self, options.delete(:object)).to_number_field_tag("number", options) 
end 

def number_field_tag(name, value = nil, options = {}) 
     options = options.stringify_keys 
     options["type"] ||= "number" 
     if range = options.delete("in") || options.delete("within") 
      options.update("min" => range.min, "max" => range.max) 
     end 
     text_field_tag(name, value, options) 
end 

Я добавляю это модуль, который я включить в мой помощник приложения. Метод to_number_field_tag прост, потому что я могу просто открыть класс и добавить переопределение.

Методы модуля FormHelper У меня возникли проблемы с тем, что я не могу полностью выяснить цепь предков и не знаю, как охватить мое переопределение. Я не знаю, как заставить его работать в основном.

ответ

0

Моя проблема была в том, что я не переопределял FormBuilder. Вот решение для тех, кому это может понадобиться в будущем.

Вместо того, чтобы просто вводить тип ввода type="number", я решил создать общий помощник для всех новых входов HTML5. Я помещаю этот код в файл переопределений, который я включаю в application_helper.rb.

# file 'rails_overrides.rb` 

ActionView::Helpers::InstanceTag.class_eval do 
    def to_custom_field_tag(field_type, options = {}) 
     options = options.stringify_keys 
     to_input_field_tag(field_type, options) 
     end 
end 

ActionView::Helpers::FormBuilder.class_eval do 
    def custom_field(method, options = {}, html_options = {}) 
     @template.custom_field(@object_name, method, objectify_options(options), html_options) 
    end 
end 

# form.custom_field helper to use in views 
def custom_field(object_name, method, options = {}, html_options = {}) 
    ActionView::Helpers::InstanceTag.new(object_name, method, self, options.delete(:object)).to_custom_field_tag(options.delete(:type), options) 
end 

# form.custom_field_tag helper to use in views 
def custom_field_tag(name, value = nil, options = {}) 
    options = options.stringify_keys 
    # potential sanitation. Taken from rails3 code for number_field 
    if range = options.delete("in") || options.delete("within") 
     options.update("min" => range.min, "max" => range.max) 
    end 
    text_field_tag(name, value, options) 
end 

Затем, чтобы использовать это в ваших просмотров:

<% form_for... do |form| %> 
    <%= form.custom_field :user_age, :type=>"number", :min=>"0", :max=>"1000" %> 
    <%= form.custom_field :email, :type=>"email", :required=>"true" %> 
<% end %> 

Какой будет генерировать <input type='number', and an <input type='email'

Если у вас есть пользовательские формы строитель, вам нужно будет расширить/переопределения, что хорошо. Пространство имен может различаться, но большинство стандартов таково:

MySpecialFormBuilder.class_eval do 
    def custom_field(method, options = {}, html_options = {}) 
     ...custom form builder implementation 
    end 
end 
Смежные вопросы