Ruby on rails 将查询字符串追加到url

Ruby on rails 将查询字符串追加到url,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,我有一个回调url字符串params[:callback],我需要附加一个查询字符串“&result=true”,并重定向用户。我发现更好的方法是使用addressable,但我认为对于这样的任务来说,代码太大了,特别是当我们谈论ruby时: callback = Addressable::URI.parse(params[:callback]) query = callback.query_values query[:result] = 'true' callback.query_values

我有一个回调url字符串
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
有没有更优雅的方法可以获得与此片段相同的结果?

  • 如果您不需要任何URL验证,可以这样做(看起来有点脏):
  • 否则,您必须使用一些外部库(如可寻址库)或标准库中的URI模块

您可以尝试使用
merge

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


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

我认为您非常接近最优。你可以挤出一两行,
callback.query_values = callback.query_values.merge({"result" => "true"})
但这并不能给你带来任何好处

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

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

我不想更新此主题,因为任何解决方案都不适用于我

原因是,如果实际url没有现有的查询值,那么
callback.query\u values
似乎会返回
Nil

因此,如果您有如下URL:
http://www.foo.com
http://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

干杯。

几年后,我找到了解决这个问题的更好办法

首先从
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
def url_for(选项={})
瓦尔=超级
如果参数[:locale]。是否存在?
parsed=可寻址::URI.parse(val)
query_数组=已解析。query_值(数组)||[]

query_数组OP在变量中包含URL。这不是当前的请求。是的,看起来很脏。使用Addressable查看我的代码,这段代码会更短吗?Mauna下面的回答更好,因为
回调。query\u value
可以返回
nil
,它不会响应
merge
,我只想补充一点,如果参数可能已经存在,请确保
“result”
是一个字符串,不是符号
:结果
,因此不会得到像“”或“”这样的双参数。另外,如果true是一个布尔值
结果:true
而不是字符串
结果:“true”
这可能会引发
参数错误(数组与数组的比较失败)
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