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

时间:2009-05-25 20:33:58

标签: jquery ruby-on-rails ajax json

我正在尝试发送一个如下所示的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上?

5 个答案:

答案 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 );
    }
})