gpt4 book ai didi

angularjs - MongoDB + AngularJS : _id empty in update via resourceProvider

转载 作者:可可西里 更新时间:2023-11-01 10:31:46 26 4
gpt4 key购买 nike

我正在使用 Mongodb(Rails 3 + Mongoid)和 Angular JS。

在我的数据库中,我有一个集合users,它包含一组对象addresses。我正在尝试更新数组中某个地址的字段,但是当我发送更新请求(使用 Angular 的 resourceProvider)时,Angular 发送到我的服务器的所有 _id是“{}”(即空),所以我最终得到了复制而不是修改。

$scope.user.addresses 包含非空 ID,看起来像这样:

[{_id:{$oid:"123431413243"}, text:"123 fake", cat:1},{_id:{$oid:"789789078907890}, text:"789 test", cat:7},...]

PUT 请求正文包含空 ID,看起来像这样:

{"_id":{}, "user":{"addresses_attributes":[{"_id":{}, "text":"123 fake", "cat":"1"},{"_id":{}, "text":"789 test", "cat":"7"},...]}}

Angular JS 代码

myApp.factory('Users', ['$resource', function ($resource) {
return $resource( '/users/:id.json', {id:0}, {update: {method:'PUT', _method:'PUT'}} );
}]);

myApp.controller('UsersCtrl', function ($scope, Users) {
$scope.save = function () {
$scope.user.$update({}, {user:$scope.user});
};
});

你知道为什么会这样吗?我能做些什么?

最佳答案

看起来这里有两个选项:覆盖 Angular JS 的转换行为或覆盖 Mongoid 的序列化行为。

选项 1:覆盖 Mongoid 的序列化行为

添加一个文件来覆盖 Mongoid::Document 上的 serializable_hash

# config/initializers/override_mongoid_serializable_hash.rb
module Mongoid
module Document

def serializable_hash(options={})
attrs = super
attrs['id'] = attrs.delete('_id').to_s
attrs
end

end
end

不要简单地尝试覆盖 as_json 方法,因为(出于某种原因)您为该函数定义的新行为将仅应用于调用它的对象(用户),不在包含的对象(地址)上。

选项 2:覆盖 Angular JS 的转换行为

使用此答案中的说明:https://stackoverflow.com/a/12191613/507721

简而言之,在您的 Angular JS 应用中调用 myApp.config() 时,为 $httpProvider.default.transformRequest 设置您自己的函数值。上面链接的答案示例如下:

var myApp = angular.module('myApp');

myApp.config(function ($httpProvider) {
$httpProvider.defaults.transformRequest = function(data){
if (data === undefined) {
return data;
}
return $.param(data);
}
});

上述函数的主体由您决定。然而,对其进行改造是必要的。

关于angularjs - MongoDB + AngularJS : _id empty in update via resourceProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22520393/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com