【翻訳】URI.escapeは非推奨メソッドです。content【翻訳】URI.escapeは非推奨メソッドです。あなたのクエリ文字列をパーセントエンコードするにはRubyRailsこの記事は以下のブログ記事の日本語訳です。string【翻訳】URI.escapeは非推奨メソッドです。2.7.0ではURI.escapeまたはエイリアスメソッドのURI.encodeを呼びだしたときに警告が出ます。これはあたかも新しく追加された警告のように見えますが、実際はなんと・・・10年以上も非推奨とされ続けていたのです!どうしても今までこの警告を目にしなかったんだろう?と不思議に思っている方へ。これまではverboseモードでスクリプトを実行したときだけ表示されていました。この仕様が最近変わりました。なんでURI.escapeは非推奨メソッドなの?「URIをエスケープする」という概念は実はやっかいです。URIは多数の要素(pathやqueryなど)から成り立っており、その要素をすべて同じ方法でエスケープするわけではないからです。#という文字について考えてみましょう。この文字はURIの最後に出てくるときは問題ありません(これは世間ではアンカーと呼ばれます。URI用語で言うところのfragment要素です)。ユーザー入力の一部に#が使われたとき(たとえば検索キーワードなど)は、入力値を正しく解釈するためにそれをエンコードしたいと思うはずです。同様に、クエリ文字列に=や&といった予約文字が含まれていた場合、それらが間違って区切り文字として解釈されないようにエスケープしたくなるはずです(あたかも予約文字であるかのように)。URI.escapeは単純にgsubメソッドを使って文字列全体を置換しているだけです。各要素が何であるかは区別しません。上で述べたような複雑な問題は一切考慮されないのです。修正するの?URI文字列をまるごとを受け取って、各要素の違いをうまく解釈しつつ最適なエスケープ処理を加える、というような既存の解決策はまだ見つかっていません。私が考えるに、こういう場合は各要素を別々にエンコードするのが良いと思います。一般的な(そして最も問題が起きやすい)ユースケースは、おそらくクエリ文字列(query要素)のエンコーディングでしょう。そこで、今回はこのユースケースに焦点を当てます。a-zだけをそのまま残し、それ以外のすべての予約文字をパーセントエンコードします。スペースも+に置換してくれます。以下の例を見てください。"So+scared%2C+but+let%27s+do+this%21+%23yolo"ご覧のとおり、適切なエスケープ処理を加えて安全なクエリ文字列を作ることができました。これだとちょっと手間がかかりすぎると感じた場合は、クエリ全体を適切に処理してくれる便利な方法があります。enc=nil)このメソッドは先ほどのメソッドとはインターフェースが若干異なり、Enumerable(通常はネストした配列かハッシュ)を受け取ります。それから、そのデータを使ってクエリ文字列を構築します。このメソッドは内部で.encode_www_form_componentを使うため、エンコーディング規則はどちらも同じです。異なるのは使い方だけです。以下の例を見てください。"q=how+to+speed+up+your+CI%3F&tag=%23devops&tag=%23productivity&lang=en"とても簡単ですね。Railsの場合は?Hash#to_query(Hash.to_paramというエイリアスメソッドもあります)RailsはHashクラスを拡張して、この便利なメソッドを追加しています。このメソッドは正しい形式でクエリ文字列を返します。値は適切にエスケープされます。"lang=en&q=how+to+speed+up+your+CI%3F&tag%5B%5D=%23devops&tag%5B%5D=%23productivity"(キーがアルファベット順にソートされる点にも注意してください)このメソッドにはオプション引数としてネームスペースを渡すこともできます。返ってくる文字列はネームスペースが各キーを内包する形になります。CI?"というような形です(もちろんパーセントエンコードされますが)。"search%5Blang%5D=en&search%5Bq%5D=how+to+speed+up+your+CI%3F&search%5Btag%5D%5B%5D=%23devops&search%5Btag%5D%5B%5D=%23productivity"まとめ短い記事ですが、みなさんが「この記事を読んだらURI文字列のエンコードに関する疑問が解消された!」と思ってくれたら嬉しいです。みなさんのRuby/Railsプロジェクトでは何か別の方法を使っているなら、コメント欄にてその方法も教えてください。Proをチェックしてみてください。その問題を解消します。日本語や"%"が含まれる場合のエンコード結果についてクエリ文字列に日本語が含まれる場合や、文字列に%が含まれる場合のエンコード結果も調べてみました。結果としてはURI.encodeを使った場合も、URI.encode_www_form_componentやURI.encode_www_formを使った場合も同じでした。各メソッドの公式リファレンスはこちらです。URI.encodeURI.encode_www_form_componentURI.encode_www_formまた、公式リファレンスではURI.encodeの移行先として、encode_www_form_component以外にも以下のようなメソッドが紹介されています。Ito@jnchitoSIer、社内SEを経て、ソニックガーデンに合流したプログラマ。「プロを目指す人のためのRuby入門」の著者。RSpecによるRailsテスト入門」の翻訳者。upLoginユーザーは見つかりませんでした。