Ruby on rails 作为对象oid的Ruby模型输出id

Ruby on rails 作为对象oid的Ruby模型输出id,ruby-on-rails,ruby,backbone.js,mongoid,Ruby On Rails,Ruby,Backbone.js,Mongoid,我的ruby模型,如下所示: class User include Mongoid::Document field :first_name, type: String field :birthdate, type: Date validates :first_name, :birthdate, :presence => true end 输出一个对象,如下所示: { _id: { $oid: "522884c6c4b4ae5c76000001" }, birthdat

我的ruby模型,如下所示:

class User
  include Mongoid::Document
  field :first_name, type: String
  field :birthdate, type: Date

  validates :first_name, :birthdate, :presence => true

end
输出一个对象,如下所示:

{
_id: {
$oid: "522884c6c4b4ae5c76000001"
},
birthdate: null,
first_name: null,
}
我的主干项目不知道如何处理id$oid

我发现了这篇文章和代码:

我不知道该放在哪里,也不知道如何在模型输出上调用它,所以我尝试在内部:

/config/initializers/secret_token.rb


我是Ruby和Rails新手,不知道如何继续,因此非常感谢您的帮助

您应该将其放在initializer文件夹中,创建如下文件:

/config/initializers/mongoid.rb

module Moped
  module BSON
    class ObjectId
      alias :to_json :to_s
      alias :as_json :to_s
    end
  end
end

奥瑟尔的回答对一切都有效,除了拉布尔。如果使用rabl,则attributes:id将引发异常。以下代码将与rabl兼容

module Moped
  module BSON
    class ObjectId
      def to_json(*args)
        to_s.to_json
      end

      def as_json(*args)
        to_s.as_json
      end
    end
  end
end

有关更多信息,请参阅github问题

对Kirk答案的反复介绍:

在Mongoid 4中,Moped的BSON实现已被删除,取而代之的是MongoDB BSON gem,因此Mongoid 4用户的正确版本为:

module BSON
  class ObjectId
    def to_json(*args)
      to_s.to_json
    end

    def as_json(*args)
      to_s.as_json
    end
  end
end

这里有一个更好的答案

require "bson"

class Jbuilder < JbuilderProxy

  def _extract_method_values(object, *attributes)
    attributes.each do |key|
      value = object.public_send(key)

      if value.is_a? ::BSON::ObjectId
        value = value.to_s
      end

      _set_value key, value
    end
  end
end
需要“bson”
类Jbuilder
对于使用Mongoid 4+的人,请使用此

module BSON
  class ObjectId
    alias :to_json :to_s
    alias :as_json :to_s
  end
end

monkey patch可以放在任何地方(初始化器听起来不错,不过你应该为这段代码制作一个新的初始化器),它应该可以工作。在您添加了这个并重新启动rails服务器之后,它工作了吗?发生了什么而不是您预期的情况?请,如果您使用语法结构
别名
,请正确使用它:
别名到\u json到\u s
。如果您想使用一种实际上必须传递符号的方法,请使用alias_方法:
alias_方法:to_json,:to_s
。我需要定义一种方法来包含它还是自动包含初始值设定项?我创建了这个文件,它仍然作为_id输出。$oidhi@azz0r我忘了在as_json方法上添加别名。试试那个密码。关于initializer文件夹,rails在config/initializers/内的所有文件中运行。这也很有效,只要别忘了重新启动服务器,并在缓存API时重置任何缓存(必须通过艰难的方式解决)…这对我来说很有效:如果您按照前面的回答添加
别名:to_json:to_s
解决方案,您将得到以下错误:
ArgumentError:参数数目错误(1代表0)
module BSON
  class ObjectId
    alias :to_json :to_s
    alias :as_json :to_s
  end
end