如何使用jQuery将JSON数据PUT到Ruby on Rails?

15

我正在尝试发送一个类似于以下内容的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!
我该怎么做才能在Ruby on Rails中使用JSON?

1
请通过编辑原始问题来更新它,而不是提出新问题:https://dev59.com/wHNA5IYBdhLWcg3wku3O - tvanfosson
5个回答

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

这并不是很好看,但对我来说很有效。


请注意 - 并非所有浏览器都支持PUT方法。有些只支持GET和POST方法,我不确定是哪些浏览器。 - skaffman
如果你设置了contentType,Rails会自动进行解析。请查看我的回复。 - Marc-André Lafortune

5

你需要在选项中设置contentType。contentType是你要发送的内容。dataType是你希望接收的返回类型。你应该仔细阅读ajax选项参数文档


数据也需要序列化。请看我的回答。 - Marc-André Lafortune

2
如果您不想添加脚本,可以进行以下操作。
$.parseJSON("some_jsonish_string")

2

1

您需要在选项中设置contentType"application/json"dataType只是您期望返回的内容类型。

此外,您需要使用JSON.stringify序列化您的data字段:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接