2011-07-02 126 views
17

我有一個回調url字符串params[:callback],我需要附加一個查詢字符串"&result=true"並重定向用戶。更好的方法,我發現這樣做是利用addressable的,但我認爲的代碼是太大了,任務這樣特別是當我們談論紅寶石:追加查詢字符串到url

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

redirect_to callback.to_s 

是否有得到的結果相同的一個更優雅的方式這個片段?

回答

8
  • ,如果你不需要任何URL驗證你可以做到這一點(看起來有點髒):
    
    url = params[:callback] 
    redirect_to url + (url.include?('?') ? '&' : '?') + 'result=true' 
    
  • 否則,你必須使用由標準庫或者一些外部庫(如尋址)或URI模塊
+1

是的,看起來很髒。無論如何,使用Addressable查看我的代碼是否可以縮短代碼長度? – MIchel

-2

您可以merge

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

嘗試這將增加喲ur參數給已經定義的參數。

+0

OP在變量中包含URL。這不是當前的請求URL – Gareth

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

莫納的答案如下更好,因爲'callback.query_values'可以返回'nil',它不會響應'merge' – FeifanZ

0

我覺得你非常接近最佳狀態。你可以粉碎一條或兩條線, 但它並沒有真正獲得任何東西。

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

如果回調一直是你的應用程序中,你可能有不同程度的涼意一些其他的選擇,但你沒有指定,如果是這樣的話還是不行。

8

我不想爲此主題提供更新,因爲任何解決方案都無法解決問題。

原因是,看起來callback.query_values返回Nil如果實際url沒有現有的查詢值。

因此,如果你有網址,如:http://www.foo.comhttp://www.foo.com?bar=1你應該使用下面的代碼:

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 

乾杯。

0

年後,我找到了這個問題的更好的解決方案。

獲取從super價值第一,然後做任何調整,我們需要使用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 
相關問題