Mongodb + AngularJS:通过resourceProvider更新_id为空

时间:2014-03-19 23:28:54

标签: angularjs mongodb

我正在使用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"},...]}}

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

1 个答案:

答案 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);
    }
});

上述功能的主体由您决定。然而,改变它是必要的。