word_wrap が nil を受け取った際に空文字列を返すよう修正

rails/rails

Rails のテキストヘルパー word_wrapnil を渡されたときに NoMethodError を起こしていた問題を、空文字列を返すように修正しました。これにより、他のテキストヘルパーと同様に nil 安全な呼び出しが可能になります。

背景

word_wrap はビューで長文を折り返す便利メソッドですが、引数が nil の場合に text.empty? が呼び出され NoMethodError が発生していました。実際のコードでは return +"" if text.empty? というガードだけがあり、nil に対するチェックが欠如していました。同一モジュールの truncatehighlightsimple_formatexcerpt などはすべて nil を受け入れ、適切な値(nil または空文字列)を返す実装となっており、word_wrap だけが例外を投げる例外的存在でした。したがって、nil が渡されても例外が起きないようにすることが求められました。

この不整合は、ビューでモデル属性が NULL の場合やオプションパラメータが未設定の場合に word_wrap(@post.summary) と記述するとアプリケーションがクラッシュする原因となっていました。テストでも word_wrap(nil) が失敗していることが確認され、実運用でのリスクが顕在化していました。修正により、全テキストヘルパーが同一の nil 耐性を示すようになります。

技術的な変更

この問題は word_wrap の冒頭ガードに nil 判定を追加するだけで解決しました。具体的には return +"" if text.empty?return +"" if text.nil? || text.empty? に置き換え、nil が渡されたときに即座に空文字列を返すようにしています。

@@ -325,7 +325,7 @@ def word_wrap(text, line_width: 80, break_sequence: "\n")
-        return +"" if text.empty?
+        return +"" if text.nil? || text.empty?

さらに、テストスイートに word_wrapnil を受け取ったケースを検証するテストを追加しました。追加されたテストは assert_equal "", word_wrap(nil)assert_equal "", word_wrap(nil, line_width: 3) の2パターンを確認し、修正前は NoMethodError が発生し、修正後は期待通り空文字列が返ることを保証します。これにより、コード変更の正当性が自動的に検証されます。

この変更は既存の文字列処理ロジックに影響を与えず、nil 判定だけを追加した最小限の差分です。word_wrap が返す型は従来通り文字列であり、後方互換性は完全に保たれています。

設計判断

判定に nil? を使用し、blank? ではなく nil のみを対象とした点が重要です。blank? を使うと空白文字列(例: " ")も true と判定され、折り返し対象から除外される可能性がありますが、今回の変更では空白文字列は従来通り折り返し処理の対象としたいという意図が保たれています。

word_wrap 以外のテキストヘルパーはそれぞれ nil に対して例外を出さずに nil、空文字列、あるいは HTML 文字列を返す実装となっており、今回の修正で API の一貫性が確保されました。nil が安全に扱えるようになったことで、ヘルパー群全体の使用感が統一され、開発者が個別に nil チェックを書く必要がなくなります。

この設計判断は、最小限のコード変更で既存の振る舞いを壊さずに安全性だけを向上させるという Rails の設計方針に沿ったものです。

まとめ

word_wrapnil を安全に受け取れるようになり、ビューで NULL 属性やオプションパラメータを直接渡すケースでも例外が発生しなくなります。既存の空文字列処理はそのまま保持され、後方互換性に影響はありません。テキストヘルパー全体の API が一貫した nil 耐性を示すようになり、開発者体験が向上しました。

記事メタデータ

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

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

品質レビュー結果

Review Status:
リトライ後承認
Review Count:
2回 (改善を経て承認)
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

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

リード文、背景、技術的変更、設計判断(任意)、まとめの全要素が揃っており、総論→各論→結論の流れが明確です。

カスタムMarkdown構文 ✓ PASS

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

コードブロックは正しいdiff形式で記述され、PRリンクは [#57738](URL) の形式で正しく記載されています。ファイル名付きハイライトの誤りはありません。

対象読者への適合性 ✓ PASS

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

対象はRailsエンジニアであり、専門用語や実装詳細が中心で初心者向けの余計な説明はありません。

パラグラフ・ライティング ⚠ WARNING

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

各セクションは総論・各論・結論の構成が取られていますが、背景セクションの段落が7文と長すぎるため分割が望まれます。その他の段落はトピックセンテンスで始まり、1段落1トピックの原則は守られています。

Diff内容との照合 ✓ PASS

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

記事中のdiffブロックは提供されたPRのdiffと一致しており、コード変更箇所・行番号ともに正確です。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

使用されている技術用語(nil、empty?、blank?、word_wrap など)はPRで使用された表現と整合しており、誤用はありません。

説明の技術的正確性 ✓ PASS

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

記事の技術的主張はPRの説明・diffと合致しており、因果関係も正しく述べられています。

事実の突合 ✓ PASS

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

全ての主張はPR情報(タイトル、説明、diff、テスト追加)で裏付けられており、PRに無い外部知識や推測は含まれていません。

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

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

PR番号 #57738、diffの行番号 -325,7 +325,7 など、数値・固有名詞は正確です。

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

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

記事タイトルはPRの内容「nil のとき空文字列を返す」ことを正確に日本語で表現しています。

外部知識の正確性 ✓ PASS

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

バージョンサポートやリリース日程といった外部情報は記載されておらず、PR情報に基づいた記述のみです。

時間表現の正確性 ✓ PASS

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

時間表現の歪曲はなく、PRの記述と一致しています。