我正在尝试发送一个如下所示的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
解析'
(代表):2:在__send__'
(__DELEGATION__):2:in
解析中
/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上?
答案 0 :(得分:7)
设置contentType对我不起作用。我得到一个字符串而不是params [:page]的哈希。
所以我这样解决了:
使用在JavaScript中 JSON中找到的脚本对JSON对象进行字符串化:
$.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 gem。在控制器中:
params[:page] = JSON.parse params[:page] if params[:page].is_a? String
它根本不漂亮,但它对我有用。
答案 1 :(得分:5)
您需要在选项中设置内容类型。内容类型是您要发送的内容。 dataType是您期望的。您应该仔细阅读documentation on the options argument to ajax。
答案 2 :(得分:2)
此外,抬头,但Ruby on Rails 2.3.2中存在一个错误,导致无法正常工作。请参阅 Ruby on Rails 2.3 JSON "put" request routing is broken
答案 3 :(得分:2)
如果您不想添加脚本,可以执行
$.parseJSON("some_jsonish_string")
答案 4 :(得分:1)
您需要在选项中将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 );
}
})