我有一个回调网址字符串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
是否有更优雅的方式获得与此代码段相同的结果?
答案 0 :(得分:9)
url = params[:callback]
redirect_to url + (url.include?('?') ? '&' : '?') + 'result=true'
答案 1 :(得分:9)
我不想对此主题进行更新,因为任何解决方案对我都没有用。
原因是,如果实际网址没有现有查询值,callback.query_values
似乎会返回Nil
。
因此,如果您有以下网址: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
干杯。
答案 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})
这会将您的参数添加到已定义的参数中。