質問: `BigDecimal`を使用していると, `content_tag` で `data-*`を生成した時に文字列として出力されてしまい`float`との違いに気づきました。 ``` <%= content_tag :div, 'b', data: {foo: '0.1'.to_f, bar: '0.1'.to_d} %> <%= content_tag :div, 'a', data: {foo: ['0.1'.to_f], bar: ['0.1'.to_d]} %> ``` で以下のように出力されます。 ``` b a ``` ソースコードを確認すると`ERB::Util.unwrapped_html_escape`が該当処理だと思うのですが、 違いが発生する原因が特定できませんでした。 対策としてはdecimalを使う時はfloatに変換してから出力すれば問題ないのですが、 何故このような差が発生するのでしょうか?
回答: 配列で与えた場合 (正確に言えば `String`, `Symbol`, `BigDecimal` 以外の場合) は`prefix_tag_option` 内で `.to_json` をコールしてます。これによって `Float` の場合はJSONの浮動小数点型に、`BigDecimal` はJSONの文字列に変換されています。 配列ではない場合、そのまま `tag_option` → `unwrapped_html_escape` に渡されて `.to_s` されるため、`Float` でも `BigDecimal` でも同じ挙動になります。(JSONにした場合でも `.to_s` はされるが、元々文字列なので変化はない。) ※ `.to_json` で `BigDecimal` が文字列に変換される理由は、`BigDecimal` に対応するJSONの型が存在しないためだと思います。(浮動小数点に変換すると誤差などが発生する)