5

我正在尝试将 mongoid 与 Rails 4.1.0 应用程序一起使用,并且在 moongodb 2.6.0 上收到错误 17287(与早期版本的 mongodb 上的 10068 相同)。这是错误消息:

The operation: #<Moped::Protocol::Query @length=127 @request_id=5 @response_to=0 @op_code=2004 @flags=[] @full_collection_name="educandose_development.users" @skip=0 @limit=-1 @selector={"$query"=>{"_id"=>{"$oid"=>BSON::ObjectId('534d6f4f6372618443000000')}}, "$orderby"=>{:_id=>1}} @fields=nil> failed with error 17287: "Can't canonicalize query: BadValue unknown operator: $oid" See https://github.com/mongodb/mongo/blob/master/docs/errors.md for details about this error.

知道可能出了什么问题吗?

4

3 回答 3

13

看了一会儿,我意识到 rails 4.1 上的新 json cookies 序列化程序会破坏对设计资源的轻便摩托车查询。

要解决此问题,请删除 cookies_serializer.rb 初始化程序上的以下行

Rails.application.config.action_dispatch.cookies_serializer = :json

您可能希望取回旧的 session_store.rb 文件,其内容类似于:

YourApp::Application.config.session_store :cookie_store, key: '_yourapp_session'

或尝试设计的主分支。

看看这里:https ://github.com/plataformatec/devise/issues/2949#issuecomment-40520236 和这里:https ://github.com/plataformatec/devise/pull/2882

于 2014-04-15T19:00:38.687 回答
10

暂时,直到 moped/session/json 格式被修复,我正在使用:

# app/models/concerns/zero_oid_fix.rb
module ZeroOidFix
  extend ActiveSupport::Concern

  module ClassMethods
    def serialize_from_session(key, salt)
      record = to_adapter.get((key[0]["$oid"] rescue nil))
      record if record && record.authenticatable_salt == salt
    end
  end
end

在设计模型中:

class User

  devise :database_authenticatable, ...

  # NOTE: Has to be after devise
  include ZeroOidFix

  ...
end

希望这个答案很快就会过时。

于 2014-06-24T00:52:26.277 回答
0
  1. 从cookies_serializer.rb中注释掉下面的行

    Rails.application.config.action_dispatch.cookies_serializer = :json

  2. 删除cookies。

  3. 重启服务器。

在“rails 4.1.4, devise 3.2.4, mongoid 4.0.0”上为我工作

于 2014-11-13T20:19:01.540 回答