2011-07-02 117 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 
相关问题