如何在Rails中修改date_field_tag的日期格式为yyyy/mm/dd
Rails date_field_tag 实现yyyy/mm/dd格式的解决方法
首先明确前提:HTML5原生的date类型输入控件(即date_field_tag生成的标签)的展示格式由浏览器根据用户操作系统的区域设置决定,无法通过HTML属性直接强制指定为yyyy/mm/dd,且原生控件提交的参数默认格式为yyyy-MM-dd。
另外你原代码的写法可以优化:date_field_tag的第二个参数就是默认值,无需额外传value参数,直接把值放在第二个参数位置即可。
如果需要同时控制展示和存储格式,可以按以下方案操作:
方案1:自定义输入框+日期选择组件(推荐,可完全控制展示格式)
放弃使用date_field_tag,改用text_field_tag配合前端日期选择组件,可完全自定义展示和输入格式,示例如下:
- ERB模板代码:
<%= text_field_tag 'dob', @search_params[:dob]&.strftime('%Y/%m/%d'), placeholder: 'YYYY/MM/DD', autocomplete: 'off', class: 'form-control date-picker' %>
- 引入常用的日期选择组件(如bootstrap-datepicker)后,添加JS初始化配置:
$('.date-picker').datepicker({ format: 'yyyy/mm/dd', autoclose: true })
这个方案下用户输入、前端展示的格式都是yyyy/mm/dd,提交到后端的参数也会是该格式。
方案2:保留原生date控件,仅后端处理格式
如果可以接受前端展示格式随用户系统区域变化,仅要求存储/后端处理时为yyyy/mm/dd格式,只需在控制器接收参数时做一次格式转换即可:
# 在处理dob参数的控制器逻辑中添加 if params[:dob].present? # 将原生date控件提交的yyyy-MM-dd格式转为目标格式 params[:dob] = Date.parse(params[:dob]).strftime('%Y/%m/%d') end
如果是读取已有日期数据展示,直接在赋值时格式化即可:
<%= date_field_tag 'dob', @search_params[:dob]&.strftime('%Y-%m-%d'), placeholder: 'YYYY/MM/DD', autocomplete: 'off', class: 'form-control' %>
注意:原生date控件的value必须为yyyy-MM-dd格式才能被正确识别,所以赋值时要转成ISO格式再传入
存储格式注意事项
如果存储到数据库的是日期/时间类型字段,不需要手动处理存储格式,数据库会统一存储为日期类型,你只需要在读取展示的时候用strftime('%Y/%m/%d')格式化即可。如果需要存储为字符串类型,直接把转换好格式的参数赋值给对应字段存入即可。
内容的提问来源于stack exchange,提问作者vvp45
相关产品推荐
相关产品推荐

