【问题标题】:Adding rails 3 form helpers to rails 2将 rails 3 表单助手添加到 rails 2
【发布时间】:2013-08-16 14:32:46
【问题描述】:

我想将 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 模块方法我遇到了麻烦,因为我不能完全弄清楚祖先链并且不知道如何确定我的覆盖范围。基本不知道怎么弄。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-2


    【解决方案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 %>
    

    这将生成一个&lt;input type='number', and an &lt;input type='email'

    如果您有自定义表单构建器,您还需要扩展/覆盖它。命名空间可能会有所不同,但大多数标准是这样的:

    MySpecialFormBuilder.class_eval do
        def custom_field(method, options = {}, html_options = {})
            ...custom form builder implementation
        end
    end
    

    【讨论】:

      猜你喜欢
      • 2017-11-01
      • 2012-04-01
      • 2011-04-07
      • 2014-01-26
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      • 2020-01-27
      • 1970-01-01
      相关资源
      最近更新 更多