2013-02-13 15 views
9

Ich muss Params über Javascript zurück an den Server übergeben. Im Moment ich sie in Javascript übergeben, wie so:Schienen: Pass-Params durch Ajax

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

Und sie dann so zurückschicken:

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

In meinem Controller, ich versuche, sie zu benutzen, wie ich jedes andere params:

MyModel.where(params[:q]) 

Aber die params kommen leer zurück, obwohl firebug dies zeigt sich in der POST-Register:

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 

Eine Idee, warum diese Information nicht von der Where-Klausel verarbeitet wird? Was kann ich tun, um die params Rails wieder lesbar zu machen?

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:

Das Problem offenbar von contentType stammende. Wenn ich es entferne, wird q als Rails-Parameter gesendet. Leider ist q noch in JSON, in dem Fehler führt:

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

Wie kann ich JSON zu einem params-Hash-Format konvertieren?

+0

Können Sie die Anforderung und die in der Datei development.log protokollierten Parameter anzeigen. Ich nehme an, es ist ein dev env. – manoj

+0

Guter Fang. "q" erscheint in den Parametern überhaupt nicht. Ich nehme an, es sollte, obwohl es in den Postdaten ist? – nullnullnull

Antwort

5

sein sollte Es gibt ein paar Probleme gab, die für diese Arbeit gelöst werden benötigt. Zuerst wurde q nicht als Parameter an Rails gesendet, obwohl es gebucht wurde. Der Grund war, dass es als JSON-Daten und nicht als Parameter behandelt wurde. Ich reparierte dies durch die Linie zu entfernen:

contentType: 'json' 

Danach wird die AJAX richtig gesendet ‚q‘, aber Rails hatte Probleme mit ihm, wie es in JSON war. Ich musste es mit ActiveSupport::JSON.decode analysieren, aber das warf einen 737: unexpected token Fehler. Ich führte den Code durch (JSONlint) [http://jsonlint.com/], und es stellte sich heraus, dass alle Anführungszeichen gemerkt worden waren.

Von dort gab es zwei Lösungen. Der offensichtlichste war .html_safe wie so zu verwenden:

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

Aber diese Probleme verursacht, wenn der Benutzer Anführungszeichen inputed. Die sicherere Alternative war, die maskierten HTML-Entitäten zu decodieren, nachdem sie wie folgt an Rails zurückgegeben wurden:

Und das war der Trick.

6

Ihr Datenparameter ist falsch.

Sie haben

data: {'q':q}, 

Es

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

Guter Punkt. Ich sollte nicht das erste "q" in Anführungszeichen setzen, obwohl ich in meinem Fall denke, dass ich das zweite q nicht in Anführungszeichen setzen sollte. (Es ist ein Argument, das ich in die Funktion übernommen habe.) Leider funktioniert das Ausprobieren sowohl des zitierten als auch des nicht quoted zweiten q immer noch nicht. Der q-Parameter wird aus irgendeinem Grund gemäß meinem Protokoll nicht übergeben. – nullnullnull