如何将AngularJS$资源中的参数序列化为rails 3.2兼容的参数

如何将AngularJS$资源中的参数序列化为rails 3.2兼容的参数,angularjs,ruby-on-rails-3.2,Angularjs,Ruby On Rails 3.2,我正在尝试获取angular资源,以便将我的对象正确序列化为rails 3.2控制器操作。数据格式为JSON,工作输入和所需输入(在Rails端)应为: "data"=>[{"id"=>29, "column"=>0, "position"=>0}], "id"=>"2", "page"=>{} 这适用于我们的旧代码: $.ajax type: "put" url: target dataType: "json" contentType: "

我正在尝试获取angular资源,以便将我的对象正确序列化为rails 3.2控制器操作。数据格式为JSON,工作输入和所需输入(在Rails端)应为:

"data"=>[{"id"=>29, "column"=>0, "position"=>0}], "id"=>"2", "page"=>{}
这适用于我们的旧代码:

$.ajax
  type: "put"
  url: target
  dataType: "json"
  contentType: "application/json"
  data: JSON.stringify({data: widgets})
但是,如果我尝试使用角度资源,我会得到如下结果:

"data"=>"[{\"id\":28,\"column\":2,\"position\":0}]", "id"=>"2", "page"=>{"id"=>"2"}
我首先创建了一个工厂:

app.factory "Page", ["$resource", ($resource) ->
  $resource "/admin/pages/:collectionRoute:id/:memberRoute",
  {
    id: "@id",
    memberRoute: "@memberRoute",
    collectionRoute: "@collectionRoute",
  },
  {
    update: {method: "PUT"}
    store_widgets: { method: "PUT", params: { data: "@data", memberRoute: 'store_widgets' }, isArray: true }
  }
]
。。。并使用以下命令调用
store\u widgets
函数:

Page.store_widgets(id: $scope.page_id, data: JSON.stringify(widgets) )
我尝试了几种设置数据参数的方法,但似乎不起作用。它要么作为
[Object Object]
发布,要么作为普通字符串发布


关于如何使$resource发送的请求与使用纯jQuery Ajax的请求完全相同,有什么建议吗?

这取决于您是否希望在请求正文或查询参数中传递
数据:

// 'store_widgets' action definition
store_widgets: {
  method: "PUT",
  params: {
    id: "@id",
    data: "@data",
    memberRoute: 'store_widgets'
  },
  isArray: true
}
在查询参数中:

// 'store_widgets' action definition
store_widgets: {
  method: "PUT",
  params: {
    id: "@id",
    data: "@data",
    memberRoute: 'store_widgets'
  },
  isArray: true
}
电话:


在请求机构中:

电话:


Ass$资源文档说:

可以使用以下参数调用类对象或实例对象上的操作方法:

  • HTTP获取“类”操作:Resource.action([parameters]、[success]、[error])
  • 非获取“类”操作:Resource.action([parameters]、postData、[success]、[error])
  • 非获取实例操作:实例.$action([参数],[成功],[错误])

  • 唯一能够解决序列化参数问题的方法是使用JQuery.param(),以便在PHP POST通道中查看数据

    我必须在$resource中设置标题:

    headers : {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}
    
    我对$resource方法的调用。 这又快又脏,请原谅

    vm.save = function(item) { 
      var data = $.param({username:item.username, email:item.email});
      userFactory.save(data);
    }
    

    我不得不从
    item
    中提取数据,因为$resource将方法附加到
    item
    。如果在
    上使用
    $.param
    ,它将触发所有的删除、获取、查询等操作。。附加到资源的方法。

    此问题在angular的2.0版本中得到解决(


    请看这里:

    这是我的想法,但没有发生序列化。我作为数据发送的任何内容:都只是转换为字符串。可能使用
    toString()
    ,如果您查看控制台(在运行我的plunker时),输出将变成
    {“id”=>“2”,“data”=>“[object object]”,“page”=>{}
    您将看到数据已正确序列化。也许您可以设置自己的plunker,重现该问题。否则将很难调试此问题。您是对的,对此表示抱歉。应该立即执行此操作。请稍后回来。我发现了问题。出于某种原因,
    param:{data:@data}
    似乎将我的对象转换为字符串。如果我删除该对象,它将被序列化。对此有何想法?
    vm.save = function(item) { 
      var data = $.param({username:item.username, email:item.email});
      userFactory.save(data);
    }