2013-02-13 2 views
9

Мне нужно передать параметры через javascript обратно на сервер. На данный момент я прохожу их в JavaScript следующим образом:Rails: Pass Params Through Ajax

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

А затем отправить их обратно, как это:

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

В моем контроллере, я стараюсь использовать их, как и в любом другом Params:

MyModel.where(params[:q]) 

Но PARAMS возвращаются пустыми, даже если поджигатель показывает это на вкладке 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 

Любая идея, почему эта информация не обрабатывается предложением where? Что я могу сделать, чтобы снова обновить параметры 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:

Проблема, по-видимому, вытекающих из contentType. Когда я удаляю его, тогда q отправляется как параметр Rails. К сожалению, до сих пор q в формате JSON, в результате ошибки:

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

Как я могу преобразовать JSON в Params хэш?

+0

Можете ли вы отобразить запрос и параметры, зарегистрированные в файле development.log. Я предполагаю, что это dev env. – manoj

+0

Хороший улов. «q» вообще не отображается в параметрах. Я предполагаю, что это должно произойти, даже если оно находится в почтовых данных? – nullnullnull

ответ

5

Существовали несколько вопросов, которые необходимо решить, чтобы это работало. Во-первых, q не отправлялся как параметр для Rails, хотя он был опубликован. Причина заключалась в том, что он рассматривался как данные JSON, а не как параметр. Я это исправил, удалив строку:

contentType: 'json' 

После этого, AJAX правильно посланный «Q», но Rails были проблемы, используя его, как это было в формате JSON. Мне пришлось анализировать его с помощью ActiveSupport::JSON.decode, но это вызывало ошибку 737: unexpected token. Я выполнил код через (JSONlint) [http://jsonlint.com/], и оказалось, что все кавычки были экранированы.

Оттуда было два решения. Очевидным один должен был использовать .html_safe так:

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

Но это вызвало проблемы, когда пользователь котировки занесены. Безопасная альтернатива была декодировать сбежавший HTML сущность после того, как они были переданы обратно в Rails, как так:

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

И это сделали трюк.

6

Ваш параметр данных неверен.

Вы

data: {'q':q}, 

Это должно быть

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

Хорошая точка. Я не должен класть первый «q» в кавычки, хотя в моем случае, я думаю, я должен оставить второй q без кавычек. (Это аргумент, что я перешел в функцию.) К сожалению, попытка как цитируемого, так и некотированного второго q по-прежнему не работает. Параметр q по какой-либо причине не проходит, согласно моему журналу. – nullnullnull