webentwicklung-frage-antwort-db.com.de

Parameter zu URL hinzufügen

Ich habe eine URL (z. B. http://www.youtube.com/watch?v=og9B3BEnBHo ) und ich möchte einen Parameter hinzufügen (wmode = undurchsichtig), so dass Folgendes gilt:

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

Kann mir jemand sagen, welche Funktion verwendet werden soll, damit dies funktioniert?

31
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

(Der Aufruf von String stellt sicher, dass dies auch funktioniert, wenn der ursprüngliche URI keine Abfragezeichenfolge hat.)

57
steenslag

Da sich Ruby im Laufe der Jahre weiterentwickelt hat, unterscheidet sich die Antwort zwischen den Versionen.

Nach 1.9.2

Ruby 1.9.2 hat decode_www_form und encode_www_form zum URI-Modul hinzugefügt, wodurch die Kodierungsparameter vereinfacht werden.

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

Erläuterung

URI.decode_www_form zerlegt eine Folge von Abfrageparametern (uri.query) in ein verschachteltes Array von Parametern ([["v", "og9B3BEnBHo"]])

uri.query || '' liefert entweder die Abfragezeichenfolge des URI oder, falls nicht vorhanden, eine leere Zeichenfolge. Dies verhindert, dass decode_www_form in einen Fehler gerät, wenn uri.querynil ist.

<< ["wmode", "opaque"] fügt dem Array der Abfrageparameter ein weiteres Element hinzu. Sie können weitere hinzufügen, indem Sie new_query_ar: new_query_ar << ["fullscreen", "1"] erweitern.

URI.encode_www_form kodiert die neuen Abfrageparameter des verschachtelten Arrays in einen String.

Vor 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

Erläuterung

[uri.query, "wmode=opaque"] ist ein Array aller eventuellen Abfrageparameter. Sie können weitere hinzufügen, indem Sie das Array erweitern: [uri.query, "wmode=opaque", "fullscreen=1"] oder indem Sie das letzte Element hinzufügen: "wmode=opaque&fullscreen=1"

compact entfernt nil Elemente aus einem Array und entfernt somit uri.query, wenn kein Abfrageparameter vorhanden ist.

join fügt sie schließlich zu einer Abfragezeichenfolge zusammen.

17
Nick Q.

Eine andere Option ist die Verwendung des Addressable gem  

https://github.com/sporkmonger/addressable

Sobald Sie Addressable in Ihr Projekt aufnehmen, müssen Sie nur noch Folgendes tun:

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

Da Sie möglicherweise mehrere Abfrageparameter hinzufügen möchten und nicht nur einen, müssen Sie hier eine Version verwenden, mit der Sie beliebig viele Parameter anhängen können, indem Sie einfach einen Hash übergeben. Außerdem scheint ein Hash eine natürlichere Methode zu sein params trotzdem, auch wenn Sie nur einen Parameter hinzufügen.

  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

Beispiele:

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"
1
Tyler Rick