2014-04-15 7 views
5

Próbuję użyć mongoid z aplikacją Rails 4.1.0 i otrzymuję błąd 17287 na moongodb 2.6.0 (tak samo jak 10068 na wcześniejszych wersjach mongodb). Oto komunikat błędu:Mongodb kod błędu 10068 lub 17287 z szynami 4.1 i wymyślić

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. 

Każdy pomysł co może być nie tak?

Odpowiedz

13

Po chwili zastanowienia uświadomiłem sobie, że nowy seriser plików cookie json na szynach 4.1 łamie hasła motorowe dotyczące projektowania zasobów.

Aby to naprawić, usunąć następujący wiersz na cookies_serializer.rb inicjatora

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

Możesz dostać stary plik sessions_store.rb powrotem z treści podobnej do:

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

lub spróbuj głównej gałęzi urządzenia.

Spójrz tutaj: https://github.com/plataformatec/devise/issues/2949#issuecomment-40520236 i tutaj: https://github.com/plataformatec/devise/pull/2882

+5

Prowadzi to do: actionView :: Template :: Error (format pliku niezgodna marszałek (może” należy przeczytać) \t Wymagana wersja w formacie 4.8, jeśli podano 123,34), jeśli nie wyczyściłeś plików cookie. Wyczyść pliki cookie i to zniknie. –

10

tymczasowo, dopóki formatowanie motorower/sesji/json jest stała, używam:

# 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 

aw modelu opracować:

class User 

    devise :database_authenticatable, ... 

    # NOTE: Has to be after devise 
    include ZeroOidFix 

    ... 
end 

Mam nadzieję, że ta odpowiedź szybko się zdezaktualizuje.

+0

Ta poprawka zadziałała dla mnie, dziękuję. Jednak nie bardzo rozumiem, dlaczego ten błąd się dzieje i jak działa ta poprawka. Czy mógłbyś wyjaśnić, co się dzieje? – yeyo

+0

@ Serial BSON Serializacja ObjectId zmieniła się z przechowywania go jako zwykłego łańcucha szesnastkowego na obiekt '{" $ oid ":" ciąg znaków szesnastkowych "}', dzięki czemu jest bardziej zgodny z konwencją formatowania Extended JSON MongoDB (zmieniona w jednej bibliotece, ale nie drugiej). –

+0

pracował również dla mnie +1 –

0
  1. Komentarz się poniżej linii z cookies_serializer.rb

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

  2. Usuń pliki cookie.

  3. Uruchom ponownie serwer.

pracował dla mnie na "szynach 4.1.4, 3.2.4 opracowania, mongoid 4.0.0"