it-swarm-id.com

Tambahkan parameter ke url

Saya memiliki url (mis. http://www.youtube.com/watch?v=og9B3BEnBHo ) dan saya ingin menambahkan parameter ke dalamnya (wmode = opaque) sehingga:

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

Adakah yang bisa memberi tahu saya fungsi mana yang digunakan untuk membuat ini berfungsi?

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

(Panggilan ke String memastikan bahwa ini juga berfungsi jika URI asli tidak memiliki string kueri)

57
steenslag

Karena Ruby telah berevolusi selama bertahun-tahun, jawabannya berbeda antara versi.

Setelah 1.9.2

Ruby 1.9.2 melihat decode_www_form dan encode_www_form ditambahkan ke modul URI, membuat parameter pengkodean lebih mudah.

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

Penjelasan

URI.decode_www_form memecah serangkaian parameter kueri (uri.query) ke dalam array parameter bersarang ([["v", "og9B3BEnBHo"]])

uri.query || '' memasok string kueri uri, atau jika tidak ada, string kosong. Ini mencegah decode_www_form dari menjalankan kesalahan jika uri.query adalah nil.

<< ["wmode", "opaque"] menambahkan elemen lain ke array parameter kueri. Anda dapat menambahkan lebih banyak dengan memperluas new_query_ar lebih lanjut: new_query_ar << ["fullscreen", "1"]

URI.encode_www_form mengkodekan parameter kueri bersarang array menjadi string.

Sebelum 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

Penjelasan

[uri.query, "wmode=opaque"] adalah larik semua parameter kueri akhirnya. Anda dapat menambahkan lebih banyak dengan memperluas array: [uri.query, "wmode=opaque", "fullscreen=1"] atau dengan menambahkan ke elemen terakhir: "wmode=opaque&fullscreen=1"

compact menghapus elemen nil dari sebuah array, sehingga menghilangkan uri.query jika tidak ada parameter kueri yang ada.

join , akhirnya, bergabung dengan mereka ke dalam string kueri.

17
Nick Q.

Pilihan lain adalah menggunakan Permata yang dapat dialamatkan  

https://github.com/sporkmonger/addressable

Setelah Anda memasukkan Addressable dalam proyek Anda, yang harus Anda lakukan adalah:

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

Karena Anda mungkin memiliki beberapa parameter kueri yang ingin Anda tambahkan dan bukan hanya satu, inilah versi yang memungkinkan Anda menambahkan sebanyak mungkin param dengan hanya memasukkan hash ... Plus a Hash sepertinya cara yang lebih alami untuk masuk params, walaupun Anda hanya menambahkan satu param.

  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

Contoh:

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