Rails Simple Form如何将dob日期字段渲染为3个独立整数输入框
Simple Form拆分日期字段为独立整数输入框的解决方案
注:Simple Form默认的date类型输入渲染逻辑固定为下拉选择框,没有内置参数切换为输入框模式,所以需要通过自定义组件或手动拆分的方式实现需求。
方案1:自定义输入组件(复用性最高)
在config/initializers/simple_form.rb中添加自定义输入类型的注册代码:
# 自定义日期整数输入组件 class SimpleForm::Inputs::DateIntegerInput < SimpleForm::Inputs::Base def input(wrapper_options = nil) merged_input_options = merge_wrapper_options(input_html_options, wrapper_options) merged_input_options[:type] = 'number' # 按日、月、年顺序渲染三个数字输入框 [:day, :month, :year].map do |part| min_val = part == :year ? 1900 : 1 max_val = part == :year ? Date.today.year : (part == :month ? 12 : 31) @builder.number_field( :"#{attribute_name}(#{part == :year ? '1i' : part == :month ? '2i' : '3i'}i)", merged_input_options.merge(min: min_val, max: max_val, placeholder: part.to_s.humanize) ) end.join.html_safe end end
在表单中直接调用该自定义类型即可:<%= f.input :dob, as: :date_integer, label: '出生日期' %>
方案2:手动拆分输入框(灵活度最高)
不需要修改初始化配置,直接在视图文件中写三个独立的数字输入框即可:
<div class="dob-input-group"> <%= f.number_field :'dob(3i)', min: 1, max: 31, placeholder: '日' %> <%= f.number_field :'dob(2i)', min: 1, max: 12, placeholder: '月' %> <%= f.number_field :'dob(1i)', min: 1900, max: Date.today.year, placeholder: '年' %> </div>
Rails原生支持日期字段的多参数赋值规则,1i对应年、2i对应月、3i对应日,均为整数类型,提交后会自动组合为标准日期格式存入dob字段,无需修改控制器的参数解析逻辑。
注意事项
- 模型层可以正常添加dob的日期校验规则,三个输入框提交的参数会自动合并后触发校验,无需额外适配
- 可自定义CSS调整三个输入框的排版,比如设置为同行显示
- 若字段为必填,给三个输入框都添加
required: true参数即可
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

