我正在使用Mongodb(Rails 3 + Mongoid)和Angular JS。
在我的数据库中,我有一个集合users
,它包含一组对象addresses
。我正在尝试更新数组中地址的字段,但是当我发送更新请求时(使用Angular的resourceProvider
),Angular发送给我的服务器的所有_id
都是“{{1} “(即空),所以我最终会重复而不是修改。
$ scope.user.addresses包含非空白ID,看起来像这样:
{}
PUT请求正文中包含空ID,看起来像这样:
[{_id:{$oid:"123431413243"}, text:"123 fake", cat:1},{_id:{$oid:"789789078907890}, text:"789 test", cat:7},...]
Angular JS代码
{"_id":{}, "user":{"addresses_attributes":[{"_id":{}, "text":"123 fake", "cat":"1"},{"_id":{}, "text":"789 test", "cat":"7"},...]}}
你知道为什么会这样,我能做些什么吗?
答案 0 :(得分:2)
看起来这里有两个选项:覆盖Angular JS的转换行为或覆盖Mongoid的序列化行为。
选项1:覆盖Mongoid的序列化行为
添加文件以覆盖serializable_hash
上的Mongoid::Document
。
# 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
方法,因为(由于某种原因)您为该函数定义的新行为将仅适用于调用它的对象(User),而不是在包含的对象(地址)。
选项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);
}
});
上述功能的主体由您决定。然而,改变它是必要的。