Append query string to url

2020-05-25 06:32发布

I have a callback url string params[:callback] and I need to append a query string "&result=true" and redirect the user. The better way I found of doing this is using addressable but I think the code is too big for task like this especially when we are talking about ruby:

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

redirect_to callback.to_s

Is there a more elegant way of getting the same result as this snippet?

6条回答
冷血范
2楼-- · 2020-05-25 07:02
callback.query_values = callback.query_values.merge({"result" => "true"})
查看更多
干净又极端
3楼-- · 2020-05-25 07:03

years later, I find a better solution of this problem.

Get the value from the super first, then do any tweaks we need using 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
查看更多
欢心
4楼-- · 2020-05-25 07:16

You can try with merge

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

this will add your parameter to the ones already defined.

查看更多
孤傲高冷的网名
5楼-- · 2020-05-25 07:19

I think you're pretty close to optimal. you could crush out a line or two, but it doesn't really gain you anything.

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

If the callback is always inside your application, you might have some other options with varying degrees of coolness, but you didn't specify if that was the case or not.

查看更多
叛逆
6楼-- · 2020-05-25 07:21

I wan't to bring update to this topic, because any of the solutions didn't work me.

The reason being, that it seems that callback.query_values returns Nil if the actual url doesn't have existing query values.

Therefore if you have urls such as: http://www.foo.com and http://www.foo.com?bar=1 you should use the following code:

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

Cheers.

查看更多
Fickle 薄情
7楼-- · 2020-05-25 07:22
  • if you don't need any URL validations you can do this (looks a little bit dirty):
    
    url = params[:callback]
    redirect_to url + (url.include?('?') ? '&' : '?') + 'result=true'
    
  • otherwise you have to use either some external library (like Addressable) or URI module from standard library
查看更多
登录 后发表回答