2013-02-13 13 views
9

Ho bisogno di passare i parametri tramite javascript al server. Al momento, li passo in javascript in questo modo:Rails: passare Params tramite Ajax

sendParams("<%= params[:q].to_json %>"); 

E poi rimandarli indietro in questo modo:

function sendParams(q){ 
    $.ajax({ 
    url: '/mymodel/myaction', 
    type: 'post', 
    data: {'q':q}, 
    contentType: 'json' 
    }); 
} 

Nel mio controller, cerco di utilizzare loro come avrei qualsiasi altro params:

MyModel.where(params[:q]) 

Ma i params stanno tornando vuoto, anche se firebug mostra questo nella scheda POST:

q=%7B%26quot%3Bc%26quot%3B%3A%7B%26quot%3B0%26quot%3B%3A%7B%26quot%3Ba%26quot%3B%3A%7B%26quot%3B0%26quot%3B%3A%7B%26quot%3Bname%26quot%3B%3A%26quot%3Btitle%26quot%3B%7D%7D%2C%26quot%3Bp%26quot%3B%3A%26quot%3Bcont%26quot%3B%2C%26quot%3Bv%26quot%3B%3A%7B%26quot%3B0%26quot%3B%3A%7B%26quot%3Bvalue%26quot%3B%3A%26quot%3B2%26quot%3B%7D%7D%7D%7D%2C%26quot%3Bs%26quot%3B%3A%7B%26quot%3B0%26quot%3B%3A%7B%26quot%3Bname%26quot%3B%3A%26quot%3Bvotes_popularity%26quot%3B%2C%26quot%3Bdir%26quot%3B%3A%26quot%3Bdesc%26quot%3B%7D%7D%7D 

Qualche idea sul perché questa informazione non viene elaborata dalla clausola where? Cosa posso fare per rendere nuovamente leggibili i params Rails?

UPDATE:

Started POST "/publications/search?scroll=active&page=6" for 127.0.0.1 at 2013-0 
2-12 22:55:24 -0600 
Processing by PublicationsController#index as */* 
Parameters: {"scroll"=>"active", "page"=>"6"} 

UPDATE 2:

Il problema è apparentemente derivante da contentType. Quando lo rimuovo, allora q viene inviato come parametro Rails. Purtroppo, q è ancora in JSON, causando l'errore:

undefined method `with_indifferent_access' for #<String:0x686d0a8> 

Come posso convertire JSON per un hash params?

+0

È possibile visualizzare la richiesta ei parametri registrati nel file development.log. Presumo che sia un dev env. – manoj

+0

Buona presa. "q" non appare affatto nei parametri. Suppongo che dovrebbe, anche se è nei dati del post? – nullnullnull

risposta

5

C'erano un paio di problemi che dovevano essere risolti per questo lavoro. Innanzitutto, q non è stato inviato come parametro a Rails, anche se stava postando. Il motivo era perché veniva considerato come dati JSON piuttosto che come parametro. Ho risolto questo rimuovendo la linea:

contentType: 'json' 

Dopo di che, l'AJAX correttamente inviato 'q', ma Rotaie avuto problemi usando come era in JSON. Ho dovuto analizzarlo con ActiveSupport::JSON.decode, ma questo stava lanciando un errore 737: unexpected token. Ho eseguito il codice attraverso (JSONlint) [http://jsonlint.com/], e si è scoperto che tutte le virgolette erano state scappate.

Da lì, c'erano due soluzioni. La più ovvia era quella di utilizzare .html_safe in questo modo:

sendParams("<%= params[:q].to_json.html_safe %>"); 

Ma questo ha causato problemi quando l'utente citazioni inputed. L'alternativa più sicura era di decodificare le entità HTML fuggiti dopo essere stati passati di nuovo a Rails in questo modo:

ActiveSupport::JSON.decode(CGI.unescapeHTML(params[:q])) 

E questo ha fatto il trucco.

6

Il tuo parametro di dati è sbagliato.

Si hanno

data: {'q':q}, 

Dovrebbe essere

data: {q: 'q'}, 
+1

Buon punto. Non dovrei mettere la prima 'q' tra virgolette, anche se nel mio caso, penso che dovrei lasciare il secondo q non quotato. (È un argomento che ho passato nella funzione.) Sfortunatamente, provare entrambi i secondi quotati e non quotati ancora non funziona. Il parametro q per qualche motivo non viene superato, secondo il mio log. – nullnullnull