Добавить строку запроса в 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
Есть ли более элегантный способ получить тот же результат, что и этот фрагмент?
Ответы
Ответ 1
Ответ 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})
это добавит ваш параметр к тем, которые уже определены.