2013-08-16 67 views
0

我想添加轨道3中存在的number_field形式助手到我的轨道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