我们的应用程序之前将默认日期格式定义为
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+ 中实现此行为?
请记住,
config.active_support.disable_to_s_conversion
不会在约会时恢复 to_s
的原始功能。您的日期不会达到您配置的默认格式化程序。
我不确定这是否是故意的。
您有两种选择来解决此问题:
.to_fs
。这可能是解决此问题的更正确方法。.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
完成。
此功能已在 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。
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
f.input_field :period_from, label: false, class: 'form-control',
data: { behaviour: 'datepicker', language: I18n.locale }, value: f.object.period_from&.to_fs