Как установить данные 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.

Ответ 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 );
    }
})