コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

RubyでURL用のクエリパラメータとして別のURLを値指定したいときはCGI.escapeを使う

タイトルで本文の90%を説明してしまっているシリーズ。

環境

$ ruby -v
ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-darwin16]

挙動

require 'cgi'
#=> true

# 元のURL
base_url = "https://example.net/example"
#=> "https://example.net/example"

# パラメータとして付与するURL
param_url = "https://example.com?key=value"
#=> "https://example.com?key=value"

# CGI::escapeをするといい感じにしてくれる
CGI::escape(param_url)
#=> "https%3A%2F%2Fexample.com%3Fkey%3Dvalue"

# URLの生成
url = "#{base_url}?url=#{CGI::escape(param_url)}"
#=> "https://example.net/example?url=https%3A%2F%2Fexample.com%3Fkey%3Dvalue"

名前的に URI::encode があるが、こちらは2バイト文字をパーセントエンコーディングするだけなので意図とは違うものになる。(そして今は非推奨なので使わないほうがよい)

参考URL