带有rails 4.1和devise的Mongodb错误代码10068或17287

时间:2014-04-15 19:00:39

标签: ruby-on-rails mongodb devise mongoid ruby-on-rails-4.1

我正在尝试使用mailsoid和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.

任何可能出错的想法?​​

3 个答案:

答案 0 :(得分:13)

看了一会儿之后,我意识到rails 4.1上新的json cookies序列化器会破坏设计资源上的轻量级查询。

要解决此问题,请删除cookies_serializer.rb初始化程序

上的以下行
Rails.application.config.action_dispatch.cookies_serializer = :json

您可能希望返回旧的sessions_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

答案 1 :(得分:10)

暂时,直到成田/ /会话/ 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

希望这个答案能够快速过时。

答案 2 :(得分:0)

  1. cookies_serializer.rb

    中注释掉以下一行

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

  2. 删除Cookie。

  3. 重启服务器。

  4. 在“rails 4.1.4,devise 3.2.4,mongoid 4.0.0”

    上为我工作