Как изменить данные Post ajax в событии beforeSend? - PullRequest
3 голосов
/ 25 октября 2011

Здравствуйте, у меня есть форма, которая отправляет удаленно с помощью jQuery UJS для рельсов. Я связался с событием 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 с добавленными полями, которых нет в форме. Спасибо

1 Ответ

2 голосов
/ 25 октября 2011

Вам не нужно ничего переводить в строку, чтобы поместить это в 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 stick, но вы должны использовать формат строки запроса, чтобы получить что-нибудь разумное через:

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

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

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

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

...