2011-07-02 28 views
17

params[:callback] numaralı bir geri arama URL'im var ve bir sorgu dizesi "&result=true" ekleyip kullanıcıyı yeniden yönlendirmem gerekiyor. daha iyi bir yolu bu addressable kullanıyor yapmanın buldum ama kodu, yakut bahsediyoruz özellikle böyle bir görev için çok büyük olduğunu düşünüyorum: aynı sonucu olarak almanın daha şık bir yolu var mıURL'ye sorgu dizesi ekle

callback = Addressable::URI.parse(params[:callback]) 
query = callback.query_values 
query[:result] = 'true' 
callback.query_values = query 

redirect_to callback.to_s 

Bu pasaj mı?

cevap

8
  • Bunu yapmak herhangi bir URL doğrulamaları gerekmiyorsa (görünen biraz kirli):
    
    url = params[:callback] 
    redirect_to url + (url.include?('?') ? '&' : '?') + 'result=true' 
    
  • aksi takdirde standart kitaplığından bazı dış kitaplığı (Adreslenebilir gibi) ya da URI modülü ya da kullanmak zorunda
+1

evet, kirli görünüyor kullanarak gerekmez. Adreslenebilir olan koduma bakıldığında bu kod daha kısa olabilir mi? – MIchel

-2

Buna ekleyecek merge

request.parameters.merge({:result => true})

ile deneyebilirsiniz yo Parametreyi önceden tanımlanmış olanlara gönderin.

+0

OP, bir değişkendeki URL'ye sahiptir. Şu anki istek URL'si değil – Gareth

4
callback.query_values = callback.query_values.merge({"result" => "true"}) 
+0

Mauna'nın cevabı daha iyi çünkü 'callback.query_values'' nil' geri dönebilir, 'birleştirme' yanıtı yoktur – FeifanZ

0

Bence en uygun olana oldukça yakınsınız. Bir çizgi ya da iki, ezmek olabilir, ama gerçekten size bir şey kazandırmaz. Geri arama uygulama içerisinden daima ise

callback = Addressable::URI.parse(params[:callback]) 
callback.query_values = callback.query_values.merge {:results => 'true' } 
redirect_to callback.to_s 

, sen serinlik değişen derecelerde bazı başka seçenekler de bulunabilir, ama bu böyleydi ya da değil eğer belirtmedi.

8

Bu konuyla ilgili bir güncelleştirme getirmedim çünkü çözümlerden herhangi biri beni işe yaramadı.

Mevcut gerçek URL'nin mevcut sorgu değerleri yoksa callback.query_valuesNil döndürdüğü görülüyor. http://www.foo.com ve http://www.foo.com?bar=1 aşağıdaki kodu kullanabilirsiniz gerekir:

url = "http://www.foo.com" # or params[:callback] obviously. :) 

callback = Addressable::URI.parse(url) 
callback.query_values = (callback.query_values || {}).merge({ 
    result: true 
}) 

redirect_to callback.to_s 

Şerefe

Bu amaçla geliştirilmiş URL'ler varsa.

0

yıl sonra, bu sorunun daha iyi bir çözümünü buluyorum.

sonra, ilk super değeri alın herhangi tweaks yapmak biz Addressable

def url_for(options={}) 
    val = super 
    if params[:locale].present? 
     parsed = Addressable::URI.parse(val) 
     query_array = parsed.query_values(Array) || [] 
     query_array << ['locale', params[:locale]] 
     parsed.query_values = query_array 
     val = parsed.to_s 
    end 
    val 
end