0

我想将 rails 3 中存在的number_field表单助手添加到我的 rails 2.3.15 应用程序中,但我无法扩展模块。

这些是我需要从 rails 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 模块方法,因为我无法完全弄清楚祖先链并且不知道如何确定我的覆盖范围。我不知道如何使它基本上工作。

4

1 回答 1

1

我上面的问题是我没有覆盖 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
于 2013-08-19T18:04:23.767 回答