web-dev-qa-db-ja.com

パラメータをURLに追加

URL(例 http://www.youtube.com/watch?v=og9B3BEnBHo )があり、それにパラメーター(wmode = opaque)を追加して、次のようにします。

http://www.youtube.com/watch?v=og9B3BEnBHo&wmode=opaque

これを機能させるために使用する関数を誰かに教えてもらえますか?

37
manuels
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にクエリ文字列がない場合にも機能することを保証します)

63
steenslag

Rubyは何年にもわたって進化してきたため、バージョンによって答えが異なります。

1.9.2以降

Ruby 1.9.2では、decode_www_formencode_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_formnilの場合、uri.queryがエラーに陥ることを防ぎます。

<< ["wmode", "opaque"]は、クエリパラメータの配列に別の要素を追加します。 new_query_arをさらに拡張してさらに追加できます:new_query_ar << ["fullscreen", "1"]

URI.encode_www_form ネストされた配列の新しいクエリパラメータを文字列にエンコードします。

1.9.2より前

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 最後に、それらを結合してクエリ文字列にします。

17
Nick Q.

追加するクエリパラメータが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"
5
Tyler Rick

別のオプションは、Addressable gemを使用することです

https://github.com/sporkmonger/addressable

プロジェクトにAddressableを含めたら、次のことを行うだけです。

url = Addressable::URI.parse('http://www.youtube.com/watch?v=og9B3BEnBHo')
url.query_values = url.query_values.merge(wmode:"opaque")
3
KNejad