Как я помещаю данные JSON в Ruby on Rails, используя jQuery? - PullRequest
15 голосов
/ 26 мая 2009

Я пытаюсь отправить запрос PUT jQuery Ajax, который выглядит следующим образом:

$.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 ' ( ДЕЛЕГАЦИЯ ): 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?

Ответы [ 5 ]

7 голосов
/ 17 июня 2009

Настройка contentType не работает для меня. Я получаю строку вместо хеша для params [: page].

Итак, я решил это так:

Стрификация объекта JSON с помощью скрипта, найденного в 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

Это совсем не красиво, но у меня это сработало.

5 голосов
/ 26 мая 2009

Вам нужно установить contentType в ваших настройках. contentType - это то, что вы отправляете. dataType - это то, что вы ожидаете обратно. Вам следует внимательно прочитать документацию с аргументом options для ajax .

2 голосов
/ 02 июня 2010

Если вы не хотите добавлять скрипты, вы можете сделать

$.parseJSON("some_jsonish_string")
2 голосов
/ 08 июня 2009

Кроме того, голова в порядке, но в Ruby on Rails 2.3.2 есть ошибка, которая мешает этому работать. См. Ruby on Rails 2.3. JSON маршрутизация запросов "put" не работает

1 голос
/ 23 мая 2012

Вам нужно установить 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 );
    }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...