0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Rails 7.0.7対応 その2 ActiveSupport (Fix to_s with no arguments not respecting custom :default formats)

Posted at

はじめに

こちらの記事はRails 7.0.7 バージョンアップ対応の第2弾です。
今回はActiveSupportto_sに関した変更1について確認していきます。

なお、前回記事はこちらとなります。

まとめ

デフォルトのフォーマットを指定しても、引数なしのto_sだと反映されないバグがありました。

v7.0.7では、引数なしto_sでもデフォルトのフォーマットが反映されるようになります。

デフォルトのフォーマットを利用している場合は、引数なしのto_sにおいて反映されているか確認してください。
されていないときは、to_sto_fsに修正してください。

経緯

Railsでは、いくつかのRuby組み込みクラスが拡張されています。例えば、Objectクラスにはblank?が追加されています。これらの拡張部分はActiveSupportcore_ext 2にまとめられています。

今回のバージョンアップで対象となっているのは、Timeクラスなどで拡張されているto_sとなります。

上記のto_sはフォーマットを指定できるような拡張が施されていました。
このような拡張がされている一方で、Rubyの組み込みのto_sのパフォーマンスがv3.1で改善されました3。Railsでも、その恩恵を享受したいところですが、上記の拡張が施されており叶いませんでした。

そこで、Rails v7からは、拡張のto_sto_formatted_s(to_fs)に名称を変更することで、組み込みの部分と拡張部分のどちらも利用できるようになっています[^5]。

問題点

上記のto_sからto_fsの変更に当たって、既定のフォーマットを利用したものでデグレが発生しています。

ですが、Time::DATE_FORMATS[:default] = "%Y/%m/%d"のように既定のフォーマットを指定したとき、v6では引数なしのto_sでもフォーマットが適応されていたところを、v7ではフォーマットが適応されませんでした。

これは、v7では、引数なしのto_sはRubyの組み込みのto_sが呼ばれるようになったためです。

なお、フォーマットの引数あり(to_s(:format))で利用していた場合は、問題なくフォーマットが適応されます。

バージョンアップに伴う変更点

デフォルトのフォーマットが設定されている場合は、引数なしto_sでもデフォルトフォーマットが適応されるようになりました。

動作確認

Timeを参考にして動作確認します。また、to_sに加えてto_fsも確認します。

なお、動作確認ようのコードはGithubで公開しております4

フォーマットなし

フォーマットなしで実行するとto_sto_fsともに同じ文字列を出力します。

実装
time = Time.new(2000,1,1,11,0,0)

puts "without default format"
puts "Time#to_s:  " + time.to_s
puts "Time#to_fs: " + time.to_fs
結果
without default format
Time#to_s:  2000-01-01 11:00:00 +0900
Time#to_fs: 2000-01-01 11:00:00 +0900

フォーマットあり

デフォルトのフォーマットを指定すると、v7.0.6ではフォーマットが反映されません。

実装
puts "with default format"
Time::DATE_FORMATS[:default] = "%Y年%m月%d日 %H時%M分%S秒"
puts "Time#to_s:  " + time.to_s
puts "Time#to_fs: " + time.to_fs
結果 (v7.0.6)
with default format
Time#to_s:  2000-01-01 11:00:00 +0900
Time#to_fs: 2000年01月01日 11時00分00秒
結果 (v7.0.7)
with default format
Time#to_s:  2000年01月01日 11時00分00秒
Time#to_fs: 2000年01月01日 11時00分00秒

一方で,to_s(:default)のように引数ありでデフォルトフォーマットを指定すれば、v7.0.6のto_sでもフォーマットが適応されます。

実装
puts "Time#to_s(:default): " + time.to_s(:default)
結果 (v7.0.6)
Time#to_s(:default): 2000年01月01日 11時00分00秒
  1. Merge pull request #48555 from skipkayhil/hm-fix-to-s-default

  2. 7.0.0.rc1

  3. Optimize dynamic string interpolation for symbol/true/false/nil/0-9

  4. サンプルコード

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?