#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
обратном вызове, посмотрите, пожалуйста, мое обновление.