web-dev-qa-db-ja.com

JQueryを使用してRailsにデータをPUTする方法

次のようなjquery ajax PUTリクエストを送信しようとしています。

$.ajax({
          type: "PUT",
          url: '/admin/pages/1.json',
          data: { page : {...} },
          dataType: 'json',
          success: function(msg) {
            alert( "Data Saved: " + msg );
          }
});

しかし、次のエラーが表示されます。

The error occurred while evaluating 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' ... ...

RailsはparamsをXMLとして解析しようとしていますが、JSONを使用したいです!!

JSONをRailsに追加するにはどうすればよいですか?

49
Macario Ortega

PUTとDELETEはすべてのブラウザーでサポートされているわけではありません。RubyOnRailsは、RoRがリクエストを処理する方法を示す_ methodと呼ばれる追加のパラメーターのデータの受け渡しをサポートしています。

$.ajax({
          type: "POST",
          url: '/admin/pages/1.json',
          data: { _method:'PUT', page : {...} },
          dataType: 'json',
          success: function(msg) {
            alert( "Data Saved: " + msg );
          }
});
85
duckyflip

JQueryのdataType paramは送信するものではなく、answerが期待される形式を指定します(はい、それは非常に貧弱な名前です)。 application/x-www-form-urlencoded以外の形式でデータをサーバーに送信する場合は、contentType paramを使用する必要があります。 dataをシリアル化する必要もあります。

$.ajax({
      type: "PUT",
      url: '/admin/pages/1.json',
      data: JSON.stringify({...}),
      contentType: 'application/json', // format of request payload
      dataType: 'json', // format of the response
      success: function(msg) {
        alert( "Data Saved: " + msg );
      }
});
37
lqc

OK、実際、私のJSONデータにはページキーがありませんでした、私の間違いです。それが、それが正しく解析されなかった理由です。しかし今では、適切に解析されたjsonオブジェクトの代わりに、ページキーの値として「[object Object]」文字列を取得します。

どこを見るべきか:JQueryまたはRails?

編集:

ここで見つかったスクリプトを使用して、jsonオブジェクトを文字列化する問題を解決しました:www.json.org/js.html:

$.ajax({
      type: "PUT",
      url: '/admin/pages/1.json',
      data: { page : JSON.stringify( {...} ) },
      dataType: 'json',
      success: function(msg) {
        alert( "Data Saved: " + msg );
      }
});

Rails side json gemが必要です。コントローラーで:

 params[:page] = JSON.parse params[:page] if params[:page].is_a? String
5
Macario Ortega

JQuery/Railsでも同様の問題[オブジェクトオブジェクト]が発生しましたが、JSONではなくHTMLで発生しました。おそらくこれが役立つでしょう-

[object Object]のパラメーター

data: { lesson: { date: drop_date } }

lesson[date]のパラメーター

data: { "lesson[date]": drop_date }

お役に立てれば -

1
theschmitzer
var id = $('#route_id').val()
$.ajax({
    type: 'PUT',
    url:  '/routes/'+ id,
    data: $('#markerform').serializeArray(),
    dataType: "JSON",
    success: function(data) {
        console.log(data);
    }
});
1

たぶん、jQueryでリクエストヘッダーを設定する必要があるだけです。

jQuery.ajaxSetup({ 
  'beforeSend': function(xhr) {
    xhr.setRequestHeader("Accept", "text/javascript");
  }
})
0