我正在尝试使用角度资源将我的对象正确地序列化为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_widgets
函数
Page.store_widgets(id: $scope.page_id, data: JSON.stringify(widgets) )
我尝试了一些替代方法来设置数据参数,但它似乎不起作用。它既可以发布为[Object object]
,也可以发布为普通字符串。
有关如何获取$ resource发送的请求的建议与使用纯jQuery Ajax的请求完全相同?
答案 0 :(得分:1)
取决于您是希望在请求正文还是在查询参数中传递data
:
在查询参数中:
// 'store_widgets' action definition
store_widgets: {
method: "PUT",
params: {
id: "@id",
data: "@data",
memberRoute: 'store_widgets'
},
isArray: true
}
呼叫:
function MyCtrl($scope, Page) {
$scope.widget = [
{"id":29, "column":0, "position":0}
];
Page.store_widgets({id: 2, data: $scope.widget, page: {}});
}
<小时/> 在请求正文中:
呼叫:
Page.store_widgets({id: 2, page: {}}, {data: $scope.widget});
<小时/> Ass $资源文档说:
可以使用以下参数调用类对象或实例对象上的操作方法:
- HTTP GET“class”操作:Resource.action([parameters],[success],[error])
- 非GET“类”操作:Resource.action([parameters],postData,[success],[error])
- 非GET实例操作:实例。$ action([参数],[成功],[错误])
醇>
答案 1 :(得分:1)
唯一的方法是我能够解决序列化我的参数,所以我可以看到PHP POST通道中的数据是使用JQuery.param()。
我必须在$ 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
中提取数据,因为$ resouce附加方法item
。如果您在$.param
上使用item
,它最终会触发附加到资源的所有DELETE,GET,QUERY等方法。
答案 2 :(得分:0)
这个问题在2.0版本的角度中解决了(