Append query string to url

后端 未结 6 1545
[愿得一人]
[愿得一人] 2021-02-05 08:15

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 o

相关标签:
6条回答
  • 2021-02-05 08:33

    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.

    0 讨论(0)
  • 2021-02-05 08:35

    You can try with merge

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

    this will add your parameter to the ones already defined.

    0 讨论(0)
  • 2021-02-05 08:40

    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
    
    0 讨论(0)
  • 2021-02-05 08:45

    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.

    0 讨论(0)
  • 2021-02-05 08:47
    • 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
    0 讨论(0)
  • 2021-02-05 08:48
    callback.query_values = callback.query_values.merge({"result" => "true"})
    
    0 讨论(0)
提交回复
热议问题