2012-06-19 2 views
7

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

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

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

что-то вроде этого: (В основном удаление всех Params, которые являются пустыми)

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

Как это сделать?

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

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

Дает

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

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

+0

Почему пустые значения проблема? –

+0

@SergioTulentsev Чтобы сделать URL более чистым .. –

+0

@SergioTulentsev Его форма поиска. Как только пользователь отправит форму. Все встает. –

ответ

1

Просто с простым Ol»рубин ...

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" 
+0

не работает для этого: http: // localhost: 3000/restaurants/search? Utf8 =% E2% 9C% 93 & city = & cuisine = & number_of_people = & booking% 5Bdate_of_booking% 5D = 19 + июнь + 2012 и бронирование% 5Btime_of_booking% 281i% 29% 5D = & бронирование% 5Btime_of_booking% 282i% 29% 5D = & бронирование% 5Btime_of_booking% 283i% 29% 5D = & бронирование% 5Btime_of_booking% 284i% 29% 5D = & бронирование% 5Btime_of_booking% 285i% 29% 5D = & бронирование% 5Btime_of_booking% 287i% 29% 5D = -2 & query = & commit = Submit –

+0

он отлично работает здесь. –

+1

Я сделал 'params.select! {| K, v | v.present?} ', который получает тот же результат, но я не знаю, как сделать URL-адрес ответа для очистки. – juanpastas

0

Я хотел бы предложить, если просто смотреть на старый добрый рубин, простой GSUB может быть достаточно:

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

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

url.chomp('&') 
2

Моим решением было отключить пустые входы и селе КТС:

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

Что касается удаления utf8 я нашел this. Поэтому я лучше его отправлю.

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

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 
Смежные вопросы