simple_form - 覆盖默认输入“类型”映射

时间:2014-12-06 11:23:38

标签: ruby-on-rails ruby-on-rails-4 simple-form simple-form-for

simple_form在输入字段上为任何整数属性生成“type ='number'”,而不是type ='text'。由于这会导致Chrome显示计数器控件,我宁愿使用type ='text'作为数字的默认值。

似乎可以覆盖config / intializers / simple_form.rb中的默认值,但是从文档中不清楚如何完全执行此操作。将数字列/属性设置为type ='text'的语法是什么?

2 个答案:

答案 0 :(得分:12)

您可以通过指定输入类型来覆盖每个字段的默认映射:

<%= f.input :age, as: :string %>

(映射的完整列表是here。)

但是如果你想根除项目中的数字输入,请尝试:

# config/initializers/simple_form.rb (before/after the SimpleForm.setup block, if this exists) 
module SimpleForm
  class FormBuilder < ActionView::Helpers::FormBuilder
    map_type :integer, :decimal, :float, to: SimpleForm::Inputs::StringInput
  end
end

答案 1 :(得分:0)

记录:

使用HTML5日期,时间,日期时间输入

SimpleForm::Inputs::DateTimeInput.class_eval do
  def use_html5_inputs?; input_options[:html5] || true end
end

将字符串用于日期,时间,日期时间输入

如果您要使用bootstrap-datetimepicker之类的日期时间选择器,则非常有用:

SimpleForm::FormBuilder.class_eval do
  def input(attribute_name, options = {}, &block)
    options = @defaults.deep_dup.deep_merge(options) if @defaults

    input   = find_input(attribute_name, options, &block)

    # Add native DB type as CSS class so inputs can be filtered by that
    input.input_html_classes << input.column&.type
    # Use another attribute:
    # input.input_html_options[:'data-db-type']= input.column&.type

    wrapper = find_wrapper(input.input_type, options)

    wrapper.render input
  end

  # map_type :date, :time, :datetime, to: SimpleForm::Inputs::StringInput

  alias old_default_input_type default_input_type
  def default_input_type(attribute_name, column, options)
    if column.type.in? %i(date time datetime)
      :string
    else
      old_default_input_type(attribute_name, column, options)
    end
  end
end

map_type不需要。