Rails 从 6.1 升级到 7.0 后忽略默认日期格式

问题描述 投票:0回答:4

我们的应用程序之前将默认日期格式定义为

DD/MM/YYYY
中的
config/application.rb
,如下所示:

Date::DATE_FORMATS[:default] = '%d/%m/%Y'

这在 Rails 6.1 中按预期工作,但升级到 Rails 7.0 后,它现在似乎被

.to_s
:

忽略
Loading development environment (Rails 7.0.2.2)
3.0.1 :001 > Date::DATE_FORMATS[:default]
 => "%d/%m/%Y" 
3.0.1 :002 > Date.new(2022, 12, 31).to_s
 => "2022-12-31"
3.0.1 :003 > Date.new(2022, 12, 31).to_fs
 => "31/12/2022" 

如何让

.to_s
在 Rails 7.0+ 中实现此行为?

ruby-on-rails date-formatting ruby-on-rails-7
4个回答
12
投票

请记住,

config.active_support.disable_to_s_conversion
不会在约会时恢复
to_s
的原始功能。您的日期不会达到您配置的默认格式化程序。

我不确定这是否是故意的。

您有两种选择来解决此问题:

  1. 找到您需要以所选格式显示日期的所有位置,然后添加
    .to_fs
    。这可能是解决此问题的更正确方法。
  2. 或者做我们所做的事情并违背 Rails 开发人员的意愿。添加一个初始值设定项来重写日期上的
    .to_s
    方法,因为要在代码中显示的每个日期中添加
    .to_fs
    对于您现在来说实在是太多了。

./config/initializers/date_format_fix.rb

require "date"

class Date
  def to_s(format = :default)
    if formatter = DATE_FORMATS[format]
      if formatter.respond_to?(:call)
        formatter.call(self).to_s
      else
        strftime(formatter)
      end
    else
      to_default_s
    end
  end
end

同样可以使用

Time
DateTime
完成。


4
投票

此功能已在 Rails 7 中被弃用。您可以使用 config.active_support.disable_to_s_conversion

 将其重新打开

不建议将格式传递给 #to_s,而在数组、范围、日期、日期时间、时间、BigDecimal、Float 和 Integer 中使用 #to_fs。

此弃用是为了允许 Rails 应用程序利用 Ruby 3.1 优化,使某些类型的对象的插值速度更快。

新应用程序不会在这些类上覆盖 #to_s 方法,现有应用程序可以使用 config.active_support.disable_to_s_conversion。


1
投票

module ActiveSupport class TimeWithZone def to_s(format = :default) if formatter = Time::DATE_FORMATS[format] if formatter.respond_to?(:call) formatter.call(self).to_s else strftime(formatter) end else to_default_s end end end end



-1
投票

f.input_field :period_from, label: false, class: 'form-control', data: { behaviour: 'datepicker', language: I18n.locale }, value: f.object.period_from&.to_fs

© www.soinside.com 2019 - 2024. All rights reserved.