9

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

似乎可以覆盖 config/initializers/simple_form.rb 中的默认值,但是从文档中不清楚如何准确地做到这一点。将数字列/属性设置为呈现为 type='text' 的语法是什么?

4

2 回答 2

14

You can override the default mapping on a per-field basis by specifying an input type:

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

(The full list of mappings is here.)

But if you want to eradicate numeric inputs from your project, try:

# 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
于 2014-12-06T12:54:45.107 回答
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不需要。

于 2017-05-11T20:57:25.143 回答