URL(例 http://www.youtube.com/watch?v=og9B3BEnBHo )があり、それにパラメーター(wmode = opaque)を追加して、次のようにします。
http://www.youtube.com/watch?v=og9B3BEnBHo&wmode=opaque
これを機能させるために使用する関数を誰かに教えてもらえますか?
require 'uri'
uri = URI.parse("http://www.youtube.com/watch?v=og9B3BEnBHo")
uri.query = [uri.query, "wmode=opaque"].compact.join('&')
puts uri.to_s
#edit Since 1.9.2 there are methods added to the URI module
uri = URI.parse("http://www.youtube.com/watch?v=og9B3BEnBHo")
new_query_ar = URI.decode_www_form(String(uri.query)) << ["wmode", "opaque"]
uri.query = URI.encode_www_form(new_query_ar)
puts uri.to_s
(String
の呼び出しは、元のURIにクエリ文字列がない場合にも機能することを保証します)
Rubyは何年にもわたって進化してきたため、バージョンによって答えが異なります。
Ruby 1.9.2では、decode_www_form
とencode_www_form
がURIモジュールに追加され、エンコーディングパラメータが簡単になりました。
require 'uri'
uri = URI.parse("http://www.youtube.com/watch?v=og9B3BEnBHo")
new_query_ar = URI.decode_www_form(uri.query || '') << ["wmode", "opaque"]
uri.query = URI.encode_www_form(new_query_ar)
puts uri.to_s
URI.decode_www_form
クエリパラメータの文字列(uri.query
)をネストされたパラメータの配列([["v", "og9B3BEnBHo"]]
)に分割します
uri.query || ''
は、URIのクエリ文字列、または存在しない場合は空の文字列を提供します。これにより、decode_www_form
がnil
の場合、uri.query
がエラーに陥ることを防ぎます。
<< ["wmode", "opaque"]
は、クエリパラメータの配列に別の要素を追加します。 new_query_ar
をさらに拡張してさらに追加できます:new_query_ar << ["fullscreen", "1"]
URI.encode_www_form
ネストされた配列の新しいクエリパラメータを文字列にエンコードします。
require 'uri'
uri = URI.parse("http://www.youtube.com/watch?v=og9B3BEnBHo")
uri.query = [uri.query, "wmode=opaque"].compact.join('&')
puts uri.to_s
[uri.query, "wmode=opaque"]
は、すべての最終的なクエリパラメータの配列です。配列を拡張してさらに追加することもできます:[uri.query, "wmode=opaque", "fullscreen=1"]
または最後の要素に追加することにより:"wmode=opaque&fullscreen=1"
compact
は、配列からnil
要素を削除するため、既存のクエリパラメータがない場合はuri.query
を削除します。
join
最後に、それらを結合してクエリ文字列にします。
追加するクエリパラメータが1つだけではなく複数ある可能性があるため、ハッシュを渡すだけで必要な数のパラメータを追加できるバージョンがあります。プラスハッシュは、より自然な方法で渡すように見えますとにかく、パラメータを1つだけ追加する場合でも、params
です。
require 'uri'
def add_params(url, params = {})
uri = URI(url)
params = Hash[URI.decode_www_form(uri.query || '')].merge(params)
uri.query = URI.encode_www_form(params)
uri.to_s
end
例:
pry(main)> helper.add_params("http://example.com", b: 2)
=> "http://example.com?b=2"
pry(main)> helper.add_params("http://example.com?a=1", b: 2, c: 3)
=> "http://example.com?a=1&b=2&c=3"
pry(main)> helper.add_params("http://www.youtube.com/watch?v=og9B3BEnBHo", wmode: 'opaque')
=> "http://www.youtube.com/watch?v=og9B3BEnBHo&wmode=opaque"
別のオプションは、Addressable gemを使用することです
プロジェクトにAddressableを含めたら、次のことを行うだけです。
url = Addressable::URI.parse('http://www.youtube.com/watch?v=og9B3BEnBHo')
url.query_values = url.query_values.merge(wmode:"opaque")