ActionControllerのメソッドに明示的な&blockパラメータを追加

rails/rails

Rails 8.1では、ActionController内でyieldblock_given?を使用しているメソッドに、明示的な&blockパラメータが追加されました。この変更は実行時の動作には影響しませんが、静的解析ツールとの互換性と可読性を向上させます。

背景

Railsのコードベースには、ブロックを受け取るメソッドであっても、メソッドシグネチャに&blockパラメータを明示していないものが存在していました。これらのメソッドは内部でblock_given?yieldを使用してブロックを処理していましたが、Sorbetなどの静的型チェックツールでは「ブロックパラメータを宣言していないメソッドにブロックが渡されている」という警告が発生していました(sorbet/sorbet#9791)。

また、同じファイル内の類似メソッド(each_pair(&block)each_value(&block)など)では既に&blockが明示されており、一貫性の観点からも改善の余地がありました。

技術的な変更

#56665では、以下のメソッドシグネチャが変更されています。

strong_parameters.rb

変更前:

def fetch(key, *args)
  convert_value_to_parameters(
    @parameters.fetch(key) {
      if block_given?
        yield
      elsif args.any?
        args.first
      else
        raise KeyError, "key not found: #{key}"
      end
    }
  )
end

変更後:

def fetch(key, *args, &block)
  convert_value_to_parameters(
    @parameters.fetch(key) {
      if block_given?
        yield
      elsif args.any?
        args.first
      else
        raise KeyError, "key not found: #{key}"
      end
    }
  )
end

同様に、transform_valuestransform_values!each_nested_attributeにも&blockパラメータが追加されています。

live.rb

ストリーミングレスポンスを扱うsend_streamメソッドも更新されました。

変更前:

def send_stream(filename:, disposition: "attachment", type: nil)
  # ...
  yield response.stream
end

変更後:

def send_stream(filename:, disposition: "attachment", type: nil, &block)
  # ...
  yield response.stream
end

その他のファイル

  • instrumentation.rb: cleanup_view_runtime(&block)
  • conditional_get.rb: http_cache_forever(public:, &block)
  • mime_responds.rb: respond_to(*mimes, &block)

設計判断

この変更は後方互換性を完全に維持しています。Rubyでは、メソッドが&blockパラメータを宣言していなくても、yieldblock_given?でブロックを扱うことができます。逆に、&blockを明示的に宣言しても実行時の動作は変わりません。

PRのチェックリストでは、テストとCHANGELOGの更新がスキップされています。これは、この変更が「no-op(動作に影響しない変更)」であるためです。新しいテストケースを追加する必要がなく、ユーザーに影響する動作変更もないため、CHANGELOGへの記載も不要と判断されています。

静的解析ツールのサポートを向上させつつ、既存のコードベースには一切影響を与えないという、理想的なリファクタリングの例と言えます。生成されるRDocドキュメントにもブロックパラメータが明示されるため、開発者体験の向上にも寄与します。

記事メタデータ

Generated by:
Claude Sonnet 4.5 for DiffDaily

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

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

ガイドライン準拠 ✓ PASS

記事構成とDiffDaily Styleへの準拠状況

必須要素(Title, Context, Technical Detail, Design Insight)がすべて網羅されており、構成が非常に明確です。ファイル名付きコードブロックやGitHubリンク記法も正しく使用されています。対象読者であるエンジニアに適した技術レベルで書かれています。

  • 記事構成(Title、Context、Technical Detail)
  • DiffDaily Styleガイド準拠
  • カスタムMarkdown活用
  • 対象読者への適合性
技術的整合性 ⚠ WARNING

技術的な正確性と表現の適切性

Diff情報が提供されていないため、記事内のコード引用と実際の差分との完全な照合はできませんでした。しかし、引用されているコード例は構文的に正しく、PRの目的(メソッドシグネチャへの&block追加)と整合性が取れており、技術的な説明も正確です。

  • 技術用語の正確性
  • コード例の正確性
  • 説明の技術的正確性
PR内容との整合性 ✓ PASS

元のPR情報との一致度

記事の内容は、提供されたPRのタイトルやURLから確認できる内容と完全に一致しています。背景説明(Sorbetに関する言及)や設計判断(no-opな変更)など、PRの意図を正確に汲み取っており、ハルシネーションは見られません。PR番号も正確です。

  • タイトル・説明の一致
  • Diff内容の正確な反映
  • 推測の排除