2012-06-19 9 views
7

Tengo un formulario de búsqueda, con muchas opciones, Enviado a una ruta con Obtener solicitud. URL es algo como esto:Cómo eliminar los parámetros de params en blanco de la cadena de consulta

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

con mucho más params. Quiero que sea más limpio algo así como eliminar todos los parámetros que están en blanco.

algo como esto: (eliminación Básicamente todos los parametros que son en blanco)

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

Cómo hacer esto?

Una forma se pueden utilizar

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

Le da

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

primer usuario redirección en una de entre la acción y el hecho de que en el medio de verificación acción que params están en blanco y eliminarlas y luego finalmente redirigiéndolo en la acción real de búsqueda. Pero esto suena muy cojo. ¿Cómo puedo hacer esto de una mejor manera?

+0

Por qué son los valores en blanco el problema? –

+0

@SergioTulentsev Para hacer las urls más limpias .. –

+0

@SergioTulentsev Es un formulario de búsqueda. Una vez que el usuario envía el formulario. Todo aparece. –

Respuesta

1

Sólo con ol llano' rubí ...

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

no funciona para esto: http: // localhost: 3000/restaurants/search? Utf8 =% E2% 9C% 93 & city = & cuisine = & number_of_people = & booking% 5Bdate_of_booking% 5D = 19 + June + 2012 & booking% 5Btime_of_booking% 281i% 29% 5D = & booking% 5Btime_of_booking% 282i% 29% 5D = & booking% 5Btime_of_booking% 283i% 29% 5D = & booking% 5Btime_of_booking% 284i% 29% 5D = & booking% 5Btime_of_booking% 285i% 29% 5D = & booking% 5Btime_of_booking% 287i% 29% 5D = -2 & query = & commit = Enviar –

+0

funciona bien aquí. –

+1

Hice 'params.select! {| K, v | v.present?} 'que obtiene el mismo resultado, pero no sé cómo limpiar la URL de respuesta. – juanpastas

0

Yo sugeriría, si sólo mirar viejo rubí llano, un gsub simple podría ser suficiente:

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

Nota: Esto puede dejar un símbolo de unión en el extremo, que puede ser recortado con

url.chomp('&') 
2

Mi solución fue desactivar entradas en blanco y sele CTS:

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

Acerca de la extracción utf8 me encontraron this. Así que mejor sigo enviándolo.

Al hacer todo esto en el servidor, se produjo una solicitud adicional al usar redirect_to, por lo que prefiero usar el código del lado del cliente.

1

En el método de controlador, llamar remove_empty_query_params

Entonces, como un método privado:

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 
Cuestiones relacionadas