Как изменить данные публикации ajax в событии beforeSend?

#javascript #jquery #ruby-on-rails #ruby-on-rails-3 #ujs

#javascript #jquery ( jquery ) #ruby-on-rails #ruby-on-rails-3 #ujs

Вопрос:

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

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

Ответ №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"}}
 

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

Комментарии:

1. Спасибо, я попробовал это с настройками. data = { ‘list_item[title]’: ‘привет?? там’ }; но затем я вижу это в журналах: Параметры: {«object Object»=> nil, «list_id»=>»9»} Я

2. @AnApprentice: я провел некоторое расследование, jQuery ведет себя довольно странно в том, что касается settings.data изменений в beforeSend обратном вызове, посмотрите, пожалуйста, мое обновление.