`number_to_human` と `number_to_human_size` の `precision: nil` クラッシュを修正

rails/rails

precision: nil が指定されたときに number_to_humannumber_to_human_size が例外を投げていた問題を、比較前に precision の有無を確認するガードを追加して解消しました。

背景

precision: nil は他の数値ヘルパー(number_to_currency など)で正式にサポートされており、オプションとして受け入れられテストも通っていますが、number_to_human 系はデフォルトで significant: true を設定し、内部で RoundingHelper#absolute_precision を経由していました。

そのメソッド内で options[:precision] > 0 と直接比較していたため、precisionnil の場合に NoMethodError: undefined method '>' for nil が発生し、呼び出し側がクラッシュしていました。

この挙動は特に number_to_human(123456, precision: nil)number_to_human_size(123456, precision: nil) で顕在化し、既存のテストではカバーされていなかったため修正が必要となりました。

技術的な変更

RoundingHelper#absolute_precision に対し、options[:precision] が真であることを確認する guard 条件を追加しました。これにより precisionnil の場合は比較がスキップされ、options[:precision] のデフォルト動作が保持されます。

@@
-          if options[:significant] && options[:precision] > 0
+          if options[:significant] && options[:precision] && options[:precision] > 0
             options[:precision] - digit_count(convert_to_decimal(number))
           else
             options[:precision]

テストスイートにも precision: nil のケースが追加され、number_to_human_size(123456, precision: nil) が期待通り "120.5625 KB" を、number_to_human(123456, precision: nil)"123.456 Thousand" を返すことが確認されています。

@@
+          assert_equal "120.5625 KB", number_helper.number_to_human_size(123456, precision: nil)
@@
+          assert_equal "123.456 Thousand", number_helper.number_to_human(123456, precision: nil)

設計判断

この修正は NumberToRoundedConverter#convert で採用されていたパターン if precision = options[:precision]precision > 0 と同等の安全なガードを RoundingHelper に導入したことを意味します。

ガードを追加するだけのシンプルな変更であるため、既存の precision が数値で指定されたケースへの振る舞いは一切変わらず、後方互換性が確保されています。

また、コードベース全体で options[:precision] の有無を明示的にチェックする統一性が高まり、将来的な拡張やバグ修正時の認識コストが低減します。

まとめ

precision: nil が許容される他ヘルパーと同様に、number_to_human 系でも安全にオプションを受け取れるようガードを追加したことで例外が解消され、テストでの検証も完了しました。既存機能への影響はなく、コードの一貫性が向上した変更です。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
df5fc33a

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文が冒頭にあり、背景(Context)、技術的変更(Technical Detail)、設計判断(任意)、まとめ(Conclusion)と構成されている。各要素が明示的に区切られており、結論は単なるリード文の繰り返しではない。

カスタムMarkdown構文 ⚠ WARNING

シンタックスハイライト・GitHubリンク記法の正確性

コードブロックは `language:filepath` 形式で正しく記述されているが、PRリンクが `[PR #57891](URL)` となっており、要件の `[ #123 ](URL)` 形式と異なる。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

内容はRails の数値ヘルパーに詳しいエンジニア向けで、基礎的な説明は不要。適切な技術レベルで記述されている。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションは総論・各論・結論の流れを保持し、段落はトピックセンテンスで始まり 1 段落 1 トピックで構成されている。段落長も適切で、空行で区切られている。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事中のコードブロックは Diff に示された変更と完全に一致している。変更行と追加行が正しくハイライトされている。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

使用されている用語(precision, nil, guard, RoundingHelper, NumberToRoundedConverter など)は PR と一致し、誤用はない。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

技術的説明は PR の記述と合致し、因果関係も論理的に正しい。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事の全ての主張は PR タイトル、説明、Diff のコード、テスト追加に裏付けられている。外部知識の付加はない。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR 番号 #57891、テストで期待される出力文字列など、数値・固有名詞は正確に記載されている。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事タイトルは PR タイトルの内容を正確に日本語化しており、一致している。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

バージョンサポートやリリース日程等、PR に無い外部情報は含まれていない。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

時間表現の歪曲はなし。