2013-02-13 14 views
9

Muszę przekazać params przez javascript z powrotem na serwer. W tej chwili mogę przekazać je w javascript tak:Szyny: Przekaż paramy przez Ajaxa

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

a następnie wysłać je z powrotem tak:

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

W moim kontrolera, staram się wykorzystać je jak bym innych params:

MyModel.where(params[:q]) 

Ale params wracają puste, choć Firebug pokazuje to w zakładce 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 

Każdy pomysł, dlaczego ta informacja nie jest przetwarzana przez klauzulę where? Co mogę zrobić, aby ponownie ustawić szyki parametrów do odczytu?

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:

Problemem jest podobno wynikające z contentType. Po usunięciu go, q jest wysyłany jako parametr Rails. Niestety, q jest nadal w JSON, w wyniku błędu:

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

Jak mogę konwertować JSON do mieszania params?

+0

Czy można wyświetlić żądanie i parametry zarejestrowane w pliku development.log. Zakładam, że jest to dev env. – manoj

+0

Dobry połów. "q" w ogóle nie pojawia się w parametrach. Zakładam, że powinno, nawet jeśli jest w danych postu? – nullnullnull

Odpowiedz

5

Było kilka problemów, które musiały zostać rozwiązane, aby to zadziałało. Po pierwsze, q nie był wysyłany jako parametr do Railsów, mimo że był wysyłany. Powodem było to, że był traktowany jako dane JSON, a nie jako parametr. Naprawiłem to przez usunięcie linii:

contentType: 'json' 

Po tym, AJAX prawidłowo wysłany „q”, ale Rails miał problemy używając go, jak to było w JSON. Musiałem sparsować to z ActiveSupport::JSON.decode, ale to było rzucanie błędu 737: unexpected token. Przepuściłem kod (JSONlint) [http://jsonlint.com/] i okazało się, że wszystkie cudzysłowy zostały usunięte.

Stamtąd były dwa rozwiązania. Oczywistym był w użyciu .html_safe tak:

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

Ale to spowodowało problemy, gdy użytkownik inputed cytaty. Bezpieczniejszą alternatywą było odkodowanie zindywidualizowanych encji HTML po ich przesłaniu do Rails, tak:

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

I to się udało.

6

Twój parametr danych jest nieprawidłowy.

Masz

data: {'q':q}, 

Należy

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

Dobra uwaga. Nie powinienem podawać pierwszego "q" w cudzysłowach, choć w moim przypadku myślę, że powinienem opuścić drugie q nie notowane. (Jest to argument, że przeszedłem do funkcji.) Niestety, próba zarówno cytowanego i niecytowanego drugiego q nadal nie działa. Parametr q z jakiegoś powodu nie jest przekazywany, zgodnie z moim logiem. – nullnullnull