2011-11-07 33 views
8

Dizimde bir URL var. Bazı parametreler eklemenin en kısa yolu nedir?İsteğe bağlı URL'leri artımlı olarak Ruby on Rails'de oluşturma

örn.

base = 'http://example.com' 
uri1 = some_magical_method(base, :p1 => 'v1') # => http://example.com/?p1=v1 
uri2 = some_magical_method(uri1, :p2 => 'v2') # => http://example.com/?p1=v1&p2=v2 
uri3 = some_magical_method(uri2, :p3 => nil) # => http://example.com/?p1=v1&p2=v2 

1) Ruby'de mi?

2) Raylarda mı?

cevap

16

ActiveSupport'un bulunduğu Raylar'da, en kolay yol bir karma oluşturmak ve daha sonra #to_query numaralı telefonu aramaktır. Düz Ruby

>> params = {} 
>> params[:foo] = "bar" 
>> params[:baz] = "bang" 
>> params.to_query 
=> "baz=bang&foo=bar" 

, aynı geçerlidir, ancak kodlayıcı kendiniz yazmak gerekir:

require 'cgi' 
def to_query(hsh) 
    hsh.map {|k, v| "#{k}=#{CGI::escape v}" }.join("&") 
end 

params = {} 
params[:foo] = "bar" 
params[:baz] = "bang" 

to_query params 
=> "baz=bang&foo=bar" 
+0

da sorgu dizesi ayıklanması ilgilenecek tek çağrı var mı Bir URL'den, sonra söylediklerinizi yapıyor, sonra orijinal URL'yi yeni sorgu dizesiyle mi döndürüyorsunuz? – user1015384

+0

En iyi bahsiniz, [URI :: parse] (http://www.ruby-doc.org/stdlib-1.9.3/libdoc/uri/rdoc/URI.html#method-c-parse) 'i kullanmak olacaktır. URL'yi bileşen parçalarına ayırın, ardından ilgilendiğiniz parçalarla yeniden birleştirebilirsiniz. –

+0

Bu soru, sorunun yalnızca bir yönünü yanıtlıyor: bir sorgu dizesinin oluşturulması. Nasıl eklenir? – schmijos

5
require 'open-uri' 

def params_to_query(params) 
    params.map {|p, v| "#{p}=#{URI.escape(v.to_s)}"}.join('&') 
end 

def append_url(url, params = {}) 
    uri = URI.parse(url) 
    uri.query = uri.query.nil? ? params_to_query(params) : [uri.query, params_to_query(params)].join('&') unless params.empty? 
    uri.to_s 
end 

puts append_url('http://example.com', {:query => 'my_example'} # "http://example.com?query=my_example" 
+0

Teşekkürler ama daha açık olmalıydım. Ruby ve Rails'in yerleşik kütüphanelerini kullanarak neyin mümkün olduğunu bilmek istedim. – user1015384

+0

Raylarda sadece "params_to_query (params)" params.to_query ile değiştirmeniz yeterlidir. Diğer mantıklar aynı. –