はじめに
Rubyを使用しているプロジェクトで、URI.escape
メソッドを使っていないにもかかわらず、以下のエラーが発生しました。
undefined method `escape' for URI:Module
escapeの使用箇所が見当たらないで、探すのは諦めてパッチを当てることにしました。
URI.escape
はRuby 2.7以降で非推奨となり、Ruby 3.0で削除されています。そのため、古いコードや依存ライブラリがURI.escape
に依存しているとエラーが発生することがあります。この記事では、URI.escape
が使えない環境でこのエラーを解決するためにパッチを当てる方法を紹介します。
解決方法
以下のコードを使用してURI.escape
メソッドを自前で定義することで、エラーを解決できます。このパッチはconfig/initializers/functions_overrides.rb
に追加します。
コード
require 'uri'
module URI
class << self
def escape(str)
alpha = "a-zA-Z"
alnum = "#{alpha}\\d"
unreserved = "\\-_.!~*'()#{alnum}"
reserved = ";/?:@&=+$,\\[\\]"
unsafe = Regexp.new("[^#{unreserved}#{reserved}]")
str.gsub(unsafe) do
us = $&
tmp = ''
us.each_byte do |uc|
tmp << sprintf('%%%02X', uc)
end
tmp
end.force_encoding(Encoding::US_ASCII)
end
end
end
解説
-
require 'uri'
:URI
モジュールを拡張するために、uri
ライブラリを読み込みます。 -
module URI
:URI
モジュールを再オープンし、escape
メソッドを再定義します。 -
escape
メソッド:- エスケープ対象の文字列を受け取り、正規表現を用いてエスケープ処理を行います。
- 使用できる文字(英数字、予約文字、アンパサンドなど)以外を
%XX
形式に変換します。 - 最後に、エンコーディングを
US-ASCII
に変換して返します。
使用方法
このパッチをconfig/initializers/functions_overrides.rb
に保存することで、URI.escape
メソッドが再び使えるようになります。Railsアプリケーションなどであれば、初期化時に自動で読み込まれるため、特別な設定は不要です。
ファイルの場所
config/initializers/functions_overrides.rb
上記のパスにファイルを作成し、先ほどのコードを貼り付けて保存してください。
まとめ
Ruby 3.0以降で削除されたURI.escape
を使用している古いコードやライブラリがある場合に、手軽にエラーを回避するための方法を紹介しました。この方法を使用することで、コードの修正量を最小限に抑えつつ、既存のコードを動かし続けることができます。
この記事が同様の問題に直面している方の助けになれば幸いです。もし他の方法や改善点があれば、コメントで教えてください。