2011-05-27 10 views
19

Rayların URL üretme mekanizması (bir çok noktada polymorphic_url aracılığıyla yapılan rotalar), en az GET istekleri için bir sorgu dizisine serileştirilen bir karma iletimin geçirilmesine izin verir. Bu tür bir işlevsellik elde etmenin en iyi yolu nedir, ancak herhangi bir temel yolun üstünde mi?Bir parametre kümesine dayalı bir URL oluşturacak bir Ruby kütüphanesi/mücevheri var mı?

Örneğin

, şöyle bir şey olsun isterim şunlardır: icabına için bazı kurallı kütüphane yokmuş

generate_url('http://www.google.com/', :q => 'hello world') 
    # => 'http://www.google.com/?q=hello+world' 

Kesinlikle kesinlikle benim uygulamanın uygun şartları kendi yazmak, ama olabilir Bunu kullanmayı tercih ederim :).

cevap

31

Evet, Ruby'nin standart kitaplığında, URI'lerle çalışmak için bir bütün sınıf modülü bulacaksınız. HTTP için bir tane var. Gösterdiğiniz gibi, bazı argümanlarla #build'u arayabilirsiniz. sorgu dizesi kendisi için

http://www.ruby-doc.org/stdlib/libdoc/uri/rdoc/classes/URI/HTTP.html#M009497

, sadece Rails'in Hash eklenmesini #to_query kullanın. yani

uri = URI::HTTP.build(:host => "www.google.com", :query => { :q => "test" }.to_query) 
+1

Harika! URI modülünü daha önce hiç görmediğimi söyleyemem, bu yüzden süper. –

+2

'undefined method 'to_query' için # (NoMethodError)' – Nakilon

+0

@Nakilon Hangi Rails sürümünü kullanıyorsunuz? – d11wtq

2
partiye Geç

ama bana izin derece Addressable taş tavsiye. Diğer kullanışlı özelliklerine ek olarak, RFC 6570 URI templates aracılığıyla uri'yi yazmayı ve ayrıştırmayı destekliyor. Verilen örnek uyarlamak için deneyin:

gsearch = Addressable::Template.new('http://google.com/{?query*}') 
gsearch.expand(query: {:q => 'hello world'}).to_s 
# => "http://www.google.com/?q=hello%20world" 

veya

gsearch = Addressable::Template.new('http://www.google.com/{?q}') 
gsearch.expand(:q => 'hello world').to_s 
# => "http://www.google.com/?q=hello%20world" 
+0

lütfen bu [URL] adresini (http://stackoverflow.com/help) kontrol edin, içerik kalitenizi yükseltmek faydalı olacaktır –

+0

Temizleyin ve örnekler ekleyin. Teşekkürler @willie! – wobh

+0

Thor geminin sadece Ruby 1.8 için Adreslenebilir olduğunu fark ettim. Bundan sonra eklenmesi gereken bir şey var mıydı? – labyrinth

İlgili konular