【问题标题】:How do I PUT JSON data to Ruby on Rails using jQuery?如何使用 jQuery 将 JSON 数据放入 Ruby on Rails?
【发布时间】:2009-05-25 20:33:58
【问题描述】:

我正在尝试发送如下所示的 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:inparse' (DELEGATION):2:in __send__' (__DELEGATION__):2:inparse' /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?

【问题讨论】:

标签: jquery ruby-on-rails ajax json


【解决方案1】:

设置 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,我不确定是哪个。
  • 如果您设置了 contentType,Rails 将自动完成解析。查看我的回复
【解决方案2】:

您需要在选项中设置 contentType。 contentType 是您要发送的内容。 dataType 是您所期望的。你应该仔细阅读documentation on the options argument to ajax

【讨论】:

  • 数据也需要序列化。看我的回答
【解决方案3】:

如果你不想添加脚本,你可以这样做

$.parseJSON("some_jsonish_string")

【讨论】:

    【解决方案4】:

    另外,请注意,但是 Ruby on Rails 2.3.2 中存在一个错误,阻止了它的工作。见Ruby on Rails 2.3 JSON "put" request routing is broken

    【讨论】:

      【解决方案5】:

      您需要在选项中将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 );
          }
      })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-17
        • 2010-10-28
        • 1970-01-01
        • 2016-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多