次のような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に追加するにはどうすればよいですか?
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 );
}
});
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 );
}
});
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
JQuery/Railsでも同様の問題[オブジェクトオブジェクト]が発生しましたが、JSONではなくHTMLで発生しました。おそらくこれが役立つでしょう-
[object Object]
のパラメーター
data: { lesson: { date: drop_date } }
lesson[date]
のパラメーター
data: { "lesson[date]": drop_date }
お役に立てれば -
var id = $('#route_id').val()
$.ajax({
type: 'PUT',
url: '/routes/'+ id,
data: $('#markerform').serializeArray(),
dataType: "JSON",
success: function(data) {
console.log(data);
}
});
たぶん、jQueryでリクエストヘッダーを設定する必要があるだけです。
jQuery.ajaxSetup({
'beforeSend': function(xhr) {
xhr.setRequestHeader("Accept", "text/javascript");
}
})