Как установить данные JSON в Ruby on Rails с помощью jQuery?
Я пытаюсь отправить запрос JQuery Ajax PUT, который выглядит следующим образом:
$.ajax({
type: "PUT",
url: '/admin/pages/1.json',
data: { page : {...} },
dataType: 'json',
success: function(msg) {
alert( "Data Saved: " + msg );
}
});
Мой контроллер выглядит примерно так:
respond_to do |format|
if @page.update_attributes params[:page]
format.html{ ... }
format.json{ render :json => {:saved => 'ok'}.to_json }
else
format.html{ ... }
format.json{ render :json => {:saved => 'fail'}.to_json }
end
end
но я получаю следующую ошибку.
Ошибка при оценке nil.name /Library/Ruby/Gems/ 1.8/gems/activesupport-2.3.2/lib/active_support/xml_mini/rexml.rb:29:in merge_element!'
/Library/Ruby/Gems/1.8/gems/activesupport-2.3.2/lib/active_support/xml_mini/rexml.rb:18:in
parse ' (DELEGATION): 2: in __send__'
(__DELEGATION__):2:in
parse ' /Library/Ruby/Gems/ 1.8/gems/activesupport-2.3.2/lib/active_support/core_ext/hash/conversions.rb:154:in `from_xml '
...
...
Как Ruby on Rails пытается проанализировать параметры как XML, но я хочу использовать JSON!
Что мне делать, чтобы включить JSON в Ruby on Rails?
Ответы
Ответ 1
Настройка contentType не работает для меня. Я получал строку вместо хеша для параметров [: page].
Итак, я решил это так:
Сглаживание объекта JSON с помощью script, найденного в JSON в JavaScript:
$.ajax({
type: "PUT",
url: '/admin/pages/1.json',
data: { page : JSON.strigify( {...} ) },
dataType: 'json',
success: function(msg) {
alert( "Data Saved: " + msg );
}
});
На стороне Ruby on Rails требуется жемчужина JSON. В контроллере:
params[:page] = JSON.parse params[:page] if params[:page].is_a? String
Это совсем не красиво, но это сработало для меня.
Ответ 2
Вам нужно установить contentType в своих настройках. contentType - это то, что вы отправляете. dataType - это то, что вы ожидаете назад. Вы должны внимательно прочитать документацию в аргументе options для ajax.
Ответ 3
Кроме того, поднимитесь вверх, но есть ошибка в Ruby on Rails 2.3.2, которая мешает этому работать. См. Ruby on Rails 2.3 Отладка запроса JSON "put" нарушена
Ответ 4
Если вы не хотите добавлять скрипты, вы можете сделать
$.parseJSON("some_jsonish_string")
Ответ 5
Вам нужно установить contentType
в "application/json"
в своих опциях; dataType
- это то, что вы ожидаете.
Кроме того, вам необходимо сериализовать поле data
, используя JSON.stringify
:
$.ajax({
type: "PUT",
url: '/admin/pages/1.json',
data: JSON.stringify({ page : {...} }),
contentType: 'application/json',
dataType: 'json',
success: function(msg) {
alert( "Data Saved: " + msg );
}
})