2010-11-17 6 views
6

Me encuentro frente a uno de esos momentos en los que trabajo con Rails cuando siento que debe haber una manera mejor de lo que estoy terminando.¿Cómo puedo preservar los valores de la cadena de consulta a través de las solicitudes en Ruby on Rails?

Tengo cuatro parámetros de cadena de consulta que deseo conservar entre las solicitudes a través de varias partes de una aplicación de rieles - diferentes controladores y acciones, algunos procesados ​​mediante javascript - para que el usuario termine en una URL con los mismos parámetros querystring que comenzó con.

Me resulta difícil creer que la mejor manera sea a través de campos de formulario ocultos y volver a agregar manualmente los params como parte de un redirect_to, o al usar los valores de sesión para cada uno, parece que no es así.

¿Alguien sabe de una mejor manera de gestionar esto?

Gracias!

+0

¿Por qué no los pones en la sesión? ¿Puedes hablar un poco más sobre para qué sirven y por qué no funciona para ti ponerlos en la sesión o en la base de datos? – PreciousBodilyFluids

+0

No es tanto que no funcione, es solo que me sorprende que no sea una bondad de Rails que lo haga innecesario. En cuanto a los detalles de lo que estoy haciendo, estoy guardando un elemento de un formulario en una superposición de jQuery (representado por una vista de rieles), y después de guardar quiero que el usuario esté viendo la página en función de los mismos parámetros como cuando lo dejaron. Los parámetros son para la configuración de vista específica de la fecha y la aplicación. – evanmcd

Respuesta

5

En casos como este, a menudo utilizaré una función de ayuda para crear URL en función del conjunto actual de parámetros. En otras palabras, me defino esto:

def merge_params(p={}) 
    params.merge(p).delete_if{|k,v| v.blank?} 
end 

Y entonces lo uso con url_for para crear las URL de los formularios y enlaces. Si necesita modificar y de los parametros, sólo tiene que pasar ellos en la fusión:.

# url for the current page 
url_for(merge_params) 

# url for a different action 
url_for(merge_params(:controller => 'bar', :action => 'bar')) 

# et cetera 
url_for(merge_params(:action => 'pasta', :sauce => 'secret')) 

Esto va a preservar params existentes más lo que anula combinar en

2

Si desea conservar siempre al otro lado de ciertos parámetros cada URL generada, puede implementar un método default_url_parameters en su aplicación.

Esto no está bien documentado, pero mentioned in the Rails 18n Guide

implementar en su application_controller.rb:

def default_url_options(*args) 
    super.merge(
    :foo = params[:foo], 
    :bar = params[:bar] 
) 
end 

Ahora cada URL generada por los rieles incluirá los valores de la presente solicitud de foo y bar (a menos que una URL es siendo generado que especifica específicamente aquellos para ser algo más).

+0

Esto no funciona ... tiene un error en el código = debe ser => y todavía no funciona ... incluso mientras uso rutas con raíles, tengo una funcionalidad jquery que funciona en algunas páginas, pero no en todas. – whizcreed

-1

Tenga en cuenta que esto no es una solución de rieles, pero funciona para mí en un 80% de casos. Así es como puedo lograr esto con jQuery, obviamente no es el mejor enfoque. Y no soy capaz de hacer que funcione el pasado 2 de nivel de enlaces:

function mergeGPS(){ 
    var lat = getParam('lat');//localStorage.getItem('lat'); 
    var lng = getParam('lng');//localStorage.getItem('lng'); 
    if(lat == null || lng == null){return false;} 
    var links = jQuery("a"); 
    jQuery.each(links, function(y, lnk){ 
     //debugger; 
    var uri = jQuery(lnk).attr('href') + "?lat="+lat+"&lng="+lng; 
    jQuery(lnk).attr('href',uri); 
    //debugger; 
    }) 
} 

function getParam(name) { 
    name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]"); 
    var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"), 
     results = regex.exec(location.search); 
    return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " ")); 
} 

mergeGPS necesita ser llamado al cargar la página.

Cuestiones relacionadas