Как изменить данные ajax Post в событии beforeSend?

Здравствуйте, у меня есть форма, которая отправляется удаленно с помощью jQuery UJS для рельсов. Я привязался к событию beforeSend, чтобы позволить мне изменять данные, отправляемые на сервер. Это не работает. Вот что у меня есть в файле beforeSend:

 settings.data = JSON.stringify({
      'list_item[title]' : 'hi?? there'
 })

Это не работает. В логах сервера вижу следующее:

Started POST "/lists/9/list_items" for 127.0.0.1 at 2011-10-24 14:04:36 -0700
  Processing by ListItemsController#create as JSON
  Parameters: {"{\"list_item"=>{"title"=>{"\":\"hi?? there\"}"=>nil}}, "list_id"=>"9"}

Любая идея, что я делаю неправильно? Я хочу настроить settings.data с добавлением полей, которых нет в форме. Спасибо


person AnApprentice    schedule 24.10.2011    source источник


Ответы (1)


Вам не нужно ничего записывать, чтобы поместить это в settings.data. data – это:

Данные для отправки на сервер. Он преобразуется в строку запроса, если это уже не строка. Он добавляется к URL-адресу для GET-запросов. [...] Объект должен быть парой ключ/значение.

Что вы делаете, так это помещаете эту строку:

"{"list_item[title]":"hi?? there"}"

в data, но эта строка не является строкой запроса, поэтому все запутается. Вы должны иметь возможность просто присвоить свой объект JavaScript settings.data:

settings.data = { 'list_item[title]' : 'hi?? there' };

и пусть jQuery разбирается с этим.


Обновление на основе доказательств, а не документации:

Однако дальнейшее расследование показывает, что это не работает. Если я отправляю запрос GET, любые изменения, которые я делаю в settings.data, игнорируются, но если я отправляю запрос POST, то изменения в settings.data сохраняются, но вы должны использовать формат строки запроса, чтобы получить что-либо разумное через:

settings.data = encodeURIComponent('list_item[title]')
              + '='
              + encodeURIComponent('hi?? there');

Версия settings.data в сочетании с запросом POST дает мне следующее:

Parameters: {"list_item"=>{"title"=>"hi?? there"}}

на сервере, и это похоже на то, что вам нужно. Если вы хотите сохранить некоторые исходные параметры, вам придется вручную распаковать и снова упаковать строку запроса.

person mu is too short    schedule 24.10.2011
comment
Спасибо, я попробовал это с помощью settings.data = { 'list_item[title]' : 'привет?? там' }; но потом я вижу это в логах: Параметры: {object Object=›nil, list_id=›9} I - person AnApprentice; 25.10.2011
comment
@AnApprentice: я провел некоторое расследование, jQuery ведет себя довольно странно в отношении settings.data изменений в обратном вызове beforeSend, взгляните, пожалуйста, на мое обновление. - person mu is too short; 25.10.2011