Wir haben einen Patch eingeführt, um die versehentliche Serialisierung von ActiveRecord-Modellen ohne Angabe der zu serialisierenden Felder zu verhindern. Diese Änderung stellt sicher, dass wir kontrollieren, welche Felder enthalten sind, und vermeidet potenzielle Probleme mit unvollständigen oder übermäßigen Daten, die preisgegeben werden.
Standardmäßig umfasst das Rendern eines ActiveRecord-Modells als JSON alle Attribute, was in vielen Fällen nicht wünschenswert ist. Um bessere Praktiken zu erzwingen, müssen wir angeben, welche Felder serialisiert werden sollen.
Anwendungsbeispiele
Falsche Verwendung:
def show
@user = User.first
render json: @user
end
In Entwicklung und Tests führt dies zu:
ActiveRecordSerializationSafety::BlockedSerializationError:
Serializing ActiveRecord models (User) without specifying fields is not allowed.
Use a Serializer, or pass the :only option to #serializable_hash. More info: https://meta.discourse.org/t/-/314495
./lib/freedom_patches/active_record_disable_serialization.rb:15:in `serializable_hash'
Korrekte Verwendung:
Verwendung eines Serializers
class UserSerializer < ApplicationSerializer
attributes :id, :email
end
def show
@user = User.first
render json: @user, serializer: UserSerializer
end
Verwendung der Option :only
def show
@user = User.first
render json: @user.as_json(only: [:id, :email])
end
Dieses Dokument wird versionskontrolliert – schlagen Sie Änderungen auf github vor.
Nur zur Klarstellung für diejenigen, die dies in der Praxis antreffen könnten: Dies bedeutet, dass alle Verwendungen der Serialisierungsmethoden in ActiveModel::Serialization, z. B. as_json, unabhängig vom Kontext (auch in Specs), zu einem Fehler führen, es sei denn, Sie übergeben die Option only. Weitere Informationen finden Sie unter
Ein Beispiel finden Sie unter:
5 „Gefällt mir“
pfaffman
(Jay Pfaffman)
Hat dieses Thema aufgeteilt,
4
Nun, es hat 21 Tage gedauert, aber ich habe endlich verstanden, was Sie hier in Ihrem verlinkten Code gesagt haben, zumindest in einem Kontext, und hoffentlich auch in dem anderen, der im oben genannten geteilten Thema erwähnt wird. Dieser scheint schwieriger zu sein (zumindest nach meiner Erinnerung), da ich nicht genau weiß, wo das Problem liegt.
Danke, dass Sie den Tag (oder zumindest diesen Tag) gerettet haben.
Das andere Problem war, dass mein server-Modell das user-Modell enthielt und ich den User-Serializer (oder die Begrenzung von Feldern) des User-Modells in meinem Server-Serializer aufrufen musste.
Es stellte sich heraus, dass ich keines der User-Modelle in meinem Server-Modell benötigte (user_id_war bereits vorhanden, und es besteht eine gute Chance, dass ich das nicht einmal wirklich brauche).