将查询字符串附加到url

时间:2011-07-02 21:27:02

标签: ruby-on-rails ruby ruby-on-rails-3

我有一个回调网址字符串params[:callback],我需要附加查询字符串"&result=true"并重定向用户。我发现这样做的更好方法是使用addressable,但我认为代码对于像这样的任务来说太大了,特别是当我们谈论ruby时:

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

redirect_to callback.to_s

是否有更优雅的方式获得与此代码段相同的结果?

6 个答案:

答案 0 :(得分:9)

  • 如果您不需要任何URL验证,则可以执行此操作(看起来有点脏):
    
    url = params[:callback]
    redirect_to url + (url.include?('?') ? '&' : '?') + 'result=true'
    
  • 否则您必须使用标准库
  • 中的某个外部库(如Addressable)或URI模块

答案 1 :(得分:9)

我不想对此主题进行更新,因为任何解决方案对我都没有用。

原因是,如果实际网址没有现有查询值,callback.query_values似乎会返回Nil

因此,如果您有以下网址: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

干杯。

答案 2 :(得分:4)

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

答案 3 :(得分:0)

我认为你非常接近最佳状态。你可以粉碎一两行, 但它并没有给你带来任何好处。

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

如果回调总是在您的应用程序中,您可能有一些其他选项具有不同程度的冷静,但您没有指定是否是这种情况。

答案 4 :(得分: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

答案 5 :(得分:-2)

您可以尝试使用merge

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

这会将您的参数添加到已定义的参数中。