31306


`BigDecimal`を使用していると, `content_tag` で
`data-*`を生成した時に文字列として出力されてしまい`float`との違いに気づきました。

[code]

    <%= 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]} %>
    
[/code]

で以下のように出力されます。

[code]

    <div data-foo="0.1" data-bar="0.1">b</div>
    <div data-foo="[0.1]" data-bar="["0.1"]">a</div>
    
[/code]

ソースコードを確認すると`ERB::Util.unwrapped_html_escape`が該当処理だと思うのですが、  
違いが発生する原因が特定できませんでした。  
<https://github.com/rails/rails/blob/861b70e92f4a1fc0e465ffcf2ee62680519c8f6f/actionview/lib/action_view/helpers/tag_helper.rb#L103>

対策としてはdecimalを使う時はfloatに変換してから出力すれば問題ないのですが、  
何故このような差が発生するのでしょうか？


CC BY-SA 3.0
2016-12-22T02:39:20.263
31304
2016-12-22T03:25:16.960
3271
question
ruby-on-rails
content_tag の float と decimal の扱いの違い


配列で与えた場合 (正確に言えば `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の型が存在しないためだと思います。(浮動小数点に変換すると誤差などが発生する)


CC BY-SA 3.0
2016-12-22T03:25:16.960
31306
2016-12-22T03:25:16.960
76
31304
answer