WebConsoleがRails 8.1以降の変更に対応
Rails 8.1以降で導入された ActionDispatch::RemoteIp の内部実装変更に対応するため、WebConsoleに新しいメソッドが追加されました。これにより、最新のRailsでもWebConsoleが正常に動作するようになります。
背景
rails/rails#56805 で ActionDispatch::RemoteIp の内部実装が変更され、プロキシIPのフィルタリング方法が刷新されました。この変更により、WebConsoleの WebConsole::Request::StrictIPAddress クラスが NoMethodError を引き起こすようになりました。
rails/rails#56836 で報告されたエラーログによると、ActionDispatch::RemoteIp::GetIp#first_non_proxy が none? メソッドを呼び出そうとしたものの、WebConsole::Permissions のインスタンスには該当メソッドが存在しないため、開発環境でアプリケーションが起動できない状態になっていました。
技術的な変更
lib/web_console/request.rb の StrictIPAddress クラスに first_non_proxy メソッドが追加されました。このメソッドは、Rails 8.1以降で filter_proxies に代わって呼び出される新しいインターフェースです。
変更後:
class StrictIPAddress
def initialize(req, proxies)
@req = req
@proxies = proxies
end
# Used by rails <= 8.1
def filter_proxies(ips)
ips.reject do |ip|
@proxies.include?(ip)
end
end
# Used by rails > 8.1.
def first_non_proxy(ips)
ips.find do |ip|
!@proxies.include?(ip)
end
end
end
既存の filter_proxies メソッドは Rails 8.1以前との互換性のために残されており、新しい first_non_proxy メソッドと共存する形になっています。filter_proxies が配列全体からプロキシを除外して返すのに対し、first_non_proxy は最初の非プロキシIPを見つけ次第それを返します。
設計判断
両方のメソッドを共存させる方式 が採用されました。
Rails 8.1以前と以降の両方をサポートするため、古いインターフェース(filter_proxies)を削除せず、新しいインターフェース(first_non_proxy)を追加する形になっています。コメントで各メソッドが対応するRailsのバージョンが明示されており、将来的なメンテナンスや古いバージョンのサポート終了時の判断材料となります。
実装の違いとして、filter_proxies は reject による全要素の走査を行うのに対し、first_non_proxy は find による早期リターンを行います。これはRails側の実装変更に合わせた最適化といえます。
まとめ
本PRは、Railsの内部実装変更に追従するための後方互換性を保った修正です。新旧両方のインターフェースを提供することで、幅広いRailsバージョンでWebConsoleが動作する環境を維持しています。