【问题标题】:How do I PUT data to Rails using JQuery如何使用 JQuery 将数据放入 Rails
【发布时间】:2010-10-28 19:39:09
【问题描述】:

我正在尝试发送如下所示的 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 试图将参数解析为 XML,但我想使用 JSON!

我应该怎么做才能将 JSON 放到 Rails 中?

【问题讨论】:

    标签: jquery ruby-on-rails ajax json


    【解决方案1】:

    并非所有浏览器都支持 PUT 和 DELETE,RubyOnRails 支持在您的数据中传递一个名为 _method 的额外参数,该参数将指示 RoR 将如何处理请求。

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

    【讨论】:

    • 这似乎不是这里的问题(任何现代网络浏览器真的缺乏对 PUT 的支持吗?)。服务器 /is/ 接收数据,只是没有以正确的方式解析它。
    • 是的,大多数浏览器都没有 PUT 和 DELETE,只有 GET 和 POST。服务器可能正在获取错误操作的数据,即。如果它是 POST,它通常会映射到 Create 操作,而 PUT 会映射到 Update 操作。
    • annevankesteren.nl/2007/10/http-method-support 会让我不相信(即很多浏览器实际上确实支持 PUT 和 DELETE)。
    • data 是错误的,dataType 不是需要设置的。因为这个答案浪费了一个小时。
    • @pascalbetz:正确答案是 lqc 的。这个答案不会让 Rails 将此请求解析为 json,它只会返回 json。
    【解决方案2】:

    jQuery 中的dataType 参数不是您发送的,而是指定您希望answer 的格式(是的,这是一个非常糟糕的名称)。如果您想以application/x-www-form-urlencoded 以外的格式将数据发送到服务器,您应该使用contentType 参数。你还需要序列化你的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 );
          }
    });
    

    【讨论】:

      【解决方案3】:

      好的,实际上我的 JSON 数据没有页面键,我的错。所以这就是为什么它没有正确解析。但现在我得到“[object Object]”字符串作为页面键的值,而不是一个很好解析的 json 对象。

      我应该看哪里: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 端必须需要 json gem。在控制器中:

       params[:page] = JSON.parse params[:page] if params[:page].is_a? String
      

      【讨论】:

      • 我得到 JSON.strigify 没有定义,有没有要包含的 JQuery 库?
      • 这是一个错字。它应该是“字符串化”。
      • 我的问题是即使数据库正在更新,请求仍处于待处理状态。
      【解决方案4】:
      var id = $('#route_id').val()
      $.ajax({
          type: 'PUT',
          url:  '/routes/'+ id,
          data: $('#markerform').serializeArray(),
          dataType: "JSON",
          success: function(data) {
              console.log(data);
          }
      });
      

      【讨论】:

        【解决方案5】:

        我在使用 jQuery/rails 时遇到了类似的问题 [object Object],但使用的是 HTML,而不是 JSON。也许这会有所帮助 -

        [object Object] 的参数

        data: { lesson: { date: drop_date } }
        

        lesson[date] 的参数

        data: { "lesson[date]": drop_date }
        

        希望这会有所帮助 -

        【讨论】:

          【解决方案6】:

          您可能只需要在 jQuery 上设置请求标头。

          jQuery.ajaxSetup({ 
            'beforeSend': function(xhr) {
              xhr.setRequestHeader("Accept", "text/javascript");
            }
          })
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-06-12
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多