2016-07-15 14 views
0

Ich aktualisiere meine Rails-Anwendung von v3.2 auf v4.0. In meinem User Modell habe ich eine JSON codiert Store:Store funktioniert nicht mehr beim Aktualisieren auf Rails 4.0 von 3.2

store :settings, accessors: [ 
    :confirmed, 
    :receive_marketing_emails, 
    :receive_reply_emails 
], coder: JSON 

Das funktioniert wie erwartet, Serialisierung User.settings und Bereitstellung von Zugriffsmethoden.

Wenn ich jedoch zu Rails 4.0 gehe, funktioniert der Store nicht mehr. Ich erhalte den folgenden Fehler, wenn ich versuche, einen beliebigen Benutzer nachzuschlagen:

Kann jemand irgendeinen Einblick gewähren?

Antwort

0

Per this question's answer:

Früher (Active 3.2.8) die Daten in der Datenbank gespeichert ist, ist in YAML-Format und es funktionierte mit "coder: JSON", was in ActiveRecord 4.2.4 nicht der Fall ist.

Auch wenn Sie coder: JSON angeben würden, wurden die Daten in YAML und nicht in JSON serialisiert. Seltsam.

Um meine eigene Frage zu beantworten, musste ich in Rails 4.0 nur coder: JSON zu coder: YAML ändern.

0

Es ist diese Aussage in der Rails Upgrade Guide:

Rails 4.0 geändert hat ActiveModel :: Serializer :: JSON.include_root_in_json Standardwert false. Active Model-Serializer und Active Record-Objekte haben jetzt das gleiche Standardverhalten.

Ich würde vorschlagen, dass, wenn Sie eine User Instanz zugreifen, kann das json Feld nicht deserialisiert werden, da es keine Wurzel erwartet, während die serialisierten Daten haben.

Um wieder 3.2 Verhalten auf Schienen, setzen diese in Ihrem config/initializers/wrap_parameters.rb:

ActiveSupport.on_load(:active_record) do 
    self.include_root_in_json = true 
end 
+0

Hallo Nic danke für die Antwort! Wir haben 'include_root_in_json' eigentlich seit 3.2 auf false gesetzt, also hätten die serialisierten Daten niemals eine Wurzel, richtig? –

+1

In diesem Fall ist mein Vorschlag wahrscheinlich nicht relevant. Um sicherzustellen, dass das Root-Verzeichnis vorhanden ist, sollten Sie die Rohdaten in der Datenbank überprüfen. –