Wir haben einen Patch eingeführt, um die versehentliche Serialisierung von ActiveRecord-Modellen zu verhindern, ohne die zu serialisierenden Felder anzugeben. Diese Änderung stellt sicher, dass wir kontrollieren, welche Felder enthalten sind, und vermeidet potenzielle Probleme mit unvollständigen oder übermäßigen Daten, die offengelegt werden.
Standardmäßig enthält 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 der Entwicklung und in Tests führt dies zu:
ActiveRecordSerializationSafety::BlockedSerializationError:
Das Serialisieren von ActiveRecord-Modellen (User) ohne Angabe von Feldern ist nicht erlaubt.
Verwenden Sie einen Serializer oder übergeben Sie die Option :only an #serializable_hash. Weitere Informationen: 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 ist 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).