Подтвердить что ты не робот

Добавить строку запроса в URL-адрес

У меня есть строка 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

Есть ли более элегантный способ получить тот же результат, что и этот фрагмент?

4b9b3361

Ответ 1

  • Если вам не нужны какие-либо проверки URL-адресов, вы можете сделать это (выглядит немного грязно):
    
    url = params[:callback]
    redirect_to url + (url.include?('?') ? '&' : '?') + 'result=true'
    
  • в противном случае вы должны использовать либо внешнюю библиотеку (например, Addressable), либо URI-модуль из стандартной библиотеки

Ответ 2

Я не буду обновлять эту тему, потому что ни одно из решений не сработало.

Причина состоит в том, что кажется, что callback.query_values возвращает Nil, если фактический url не имеет существующих значений запроса.

Поэтому, если у вас есть 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

Приветствия.

Ответ 3

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

Ответ 4

Я думаю, что ты почти близок к оптимальному. вы можете раздавить линию или две, но на самом деле это ничего не дает вам.

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

Если обратный вызов всегда находится внутри вашего приложения, у вас могут быть другие параметры с разной степенью прохлады, но вы не указали, было ли это так или нет.

Ответ 5

Через несколько лет я нахожу лучшее решение этой проблемы.

Сначала введите значение из 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

Ответ 6

Вы можете попробовать с помощью merge

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

это добавит ваш параметр к тем, которые уже определены.