Вопрос по ruby, ruby-on-rails, querystringparameter, query-string – Как удалить пустые значения параметров из строки запроса

8

У меня есть форма поиска с большим количеством опций, отправленная на маршрут с запросом Get. URL примерно такой:

http://localhost:3000/restaurants/search?utf8=%E2%9C%93&city=&cuisine=&number_of_people=&query=hello

с гораздо большим количеством параметров. Я хочу сделать это чище что-то вроде удаления всех пустых параметров.

как то так: (в основном удаляются все пустые параметры)

http://localhost:3000/restaurants/search?query=hello

How to do this?

Одним из способов может быть использование

CGI::parse("foo=bar&bar=foo&hello=hi")

Дает тебе

{"foo"=>["bar"], "hello"=>["hi"], "bar"=>["foo"]}

Сначала перенаправьте пользователя на промежуточное действие и промежуточное действие, проверьте, какие параметры не заполнены, и удалите их, а затем, наконец, перенаправьте его на фактическое действие поиска. Но это звучит очень неубедительно. Как я могу сделать это лучше?

Почему пустые значения являются проблемой? Sergio Tulentsev
@SergioTulentsev Это форма поиска. После того, как пользователь отправит форму. Все подходит. Mohit Jain
Вы можете сделать что-то вродеquery.gsub(/\w+=&/, ''). KL-7
Я хочу понизить комментарии Серхио. Arcolye
@SergioTulentsev Чтобы сделать URL более чистыми .. Mohit Jain

Ваш Ответ

4   ответа
2

$('form').submit (e) ->
  $(@).find('select,input').map( (i, e) -> e.disabled = !$(e).val() )

По поводу удаленияutf8 я нашелэтот, Так что я лучше продолжу посылать это.

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

1

require 'uri'
a = "http://localhost:8080/path/search?foo=&bar=&baz=2&bat=thing"
u = URI.parse(a)
params = u.query.split("&").select {|param| param =~ /=./}.join("&")
# Returns "baz=2&bat=thing" 
здесь работает нормально
я сделалparams.select!{|k, v| v.present?} который получает тот же результат, но я не знаю, как сделать URL-адрес ответа для очистки.
не работает для этого:localhost:3000/restaurants/… Mohit Jain
1

remove_empty_query_params

Тогда как частный метод:

  def remove_empty_query_params
    # Rewrites /projects?q=&status=failing to /projects?status=failing
    require 'addressable/uri'
    original = request.original_url
    parsed = Addressable::URI.parse(original)
    return unless parsed.query_values.present?
    queries_with_values = parsed.query_values.reject { |_k, v| v.blank? }
    if queries_with_values.blank?
      parsed.omit!(:query)
    else parsed.query_values = queries_with_values
    end
    redirect_to parsed.to_s unless parsed.to_s == original
  end
0

если просто взглянуть на обычный старый ruby, простого gsub может быть достаточно:

url.gsub(/[^\?&=]+=(?:&|$)/, '')

Примечание: это может оставить амперсанд в конце, который может быть урезан

url.chomp('&')

Похожие вопросы