Ruby on Rails中修改as_json里created_at的日期格式为ISO8601
解决Ruby/Rails中created_at转为ISO8601格式的问题
针对你遇到的日期格式问题,这里有几个适配你场景的解决方案,不管是用as_json还是JBuilder都能搞定:
方案1:在as_json中直接指定格式
你可以在as_json的选项里,通过自定义逻辑覆盖created_at的默认输出,利用ActiveSupport提供的iso8601方法(带参数3可保留毫秒):
message.as_json( only: [:id, :body, :direction, :kind, :sent, :is_read, :created_at, :call_tag], methods: [:delivering?, :attach_list, :voicemail_url, :status, :status_msg], transform: ->(hash, record) { hash['created_at'] = record.created_at.iso8601(3) hash } )
这种写法能精准修改当前场景下created_at的格式,不会影响其他地方的日期输出。
方案2:用JBuilder模板自定义输出
既然你控制器里在用JBuilder,直接在对应的.jbuilder视图文件里处理会更直观,完全摆脱as_json的默认限制:
json.extract! message, :id, :body, :direction, :kind, :sent, :is_read, :call_tag json.created_at message.created_at.iso8601(3) json.delivering? message.delivering? json.attach_list message.attach_list json.voicemail_url message.voicemail_url json.status message.status json.status_msg message.status_msg
这种方式能让你精确控制每个字段的输出格式,后续调整其他字段也更方便。
补充说明
iso8601(3)里的数字3表示保留三位小数(即毫秒),如果不需要毫秒,直接用iso8601()即可。- 若想全局统一日期格式,可在
config/initializers/time_formats.rb中添加:
Time::DATE_FORMATS[:iso8601] = ->(time) { time.iso8601(3) }
之后在as_json里指定created_at: :iso8601即可,但这种方式会影响全局所有接口的日期输出,适合需要统一格式的场景。
内容的提问来源于stack exchange,提问作者spflow
相关产品推荐
相关产品推荐

