2010-11-17 13 views
6

Mi trovo di fronte a uno di quei momenti di lavoro con Rails quando sento che ci deve essere un modo migliore di quello con cui sto finendo.Come posso mantenere i valori di querystring tra le richieste in Ruby on Rails?

Ho quattro parametri di querystring che voglio conservare attraverso le richieste attraverso varie parti di un'applicazione di rotaie - diversi controller e azioni, alcuni resi tramite javascript - in modo che l'utente finisca in un URL con gli stessi parametri di querystring che iniziato con.

Sto trovando difficile credere che il modo migliore sia attraverso campi di moduli nascosti e l'aggiunta manuale dei parametri come parte di un redirect_to, o utilizzando vars di sessione per ognuno - sembra proprio come unirrigare.

Qualcuno sa di un modo migliore per gestire questo?

Grazie!

+0

Perché non metterli nella sessione? Puoi parlare un po 'di più di quello che sono, e perché metterli nella sessione o nel database non funziona per te? – PreciousBodilyFluids

+0

Non è tanto che non funzioni, è solo che sono sorpreso che non sia una bontà di Rails a renderlo inutile. Per quanto riguarda le specifiche di ciò che sto facendo, sto salvando un elemento da un modulo in una sovrapposizione jQuery (reso da una vista rotaie), e dopo aver salvato voglio che l'utente stia visualizzando la pagina in base agli stessi parametri come quando l'hanno lasciato. I parametri sono per la data e la configurazione della vista specifica dell'app. – evanmcd

risposta

5

In casi come questo, utilizzerò spesso una funzione di supporto per creare URL basati sul set corrente di parametri. In altre parole, mi definisco questo:

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

e quindi utilizzarlo con url_for per creare gli URL per i moduli e collegamenti. Se è necessario modificare e delle params, basta passare nella fusione:.

# 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')) 

Questo ti preservare params esistenti più qualunque le sostituzioni si uniscono in

2

Se si desidera mantenere sempre alcuni parametri accross ogni URL generato, puoi implementare un metodo default_url_parameters nella tua app.

Questo è scarsamente documentata, ma mentioned in the Rails 18n Guide

implementare nella propria application_controller.rb:

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

Ora ogni URL generato da Rails includerà i valori del richiesta corrente per foo e bar (a meno che un url è generato che specifica quelli specificamente per essere qualcos'altro).

+0

Questo non funzionerà .. ha un bug nel codice = dovrebbe essere => e ancora non funziona .. anche mentre si usano i percorsi con i binari ho una funzionalità jquery che funziona su poche pagine ma non tutte. – whizcreed

-1

Si prega di notare che questa non è una soluzione di binari ma funziona per me nell'80% dei casi. Questo è come sono in grado di raggiungere questo obiettivo con jQuery, ovviamente non l'approccio migliore. E sono in grado di farlo funzionare passato 2 ° livello di link:

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 ha bisogno di essere chiamato al caricamento della pagina.

Problemi correlati