Ich habe eine ziemlich einfache Frage. Aber noch keine Lösung gefunden.
Hier ist die JSON-Zeichenfolge, die ich an den Server sende:
{
"name" : "abc",
"groundtruth" : {
"type" : "Point",
"coordinates" : [ 2.4, 6 ]
}
}
Mit der neuen Genehmigungsmethode habe ich:
params.require(:measurement).permit(:name, :groundtruth)
Dies wirft keine Fehler aus, aber der erstellte Datenbankeintrag enthält null
anstelle des Grundwahrheitswerts.
Wenn ich nur setze:
params.require(:measurement).permit!
Alles wird wie erwartet gespeichert, aber dies beeinträchtigt natürlich die Sicherheit, die durch starke Parameter bereitgestellt wird.
Ich habe Lösungen gefunden, wie man Arrays zulässt, aber kein einziges Beispiel mit verschachtelten Objekten. Dies muss irgendwie möglich sein, da es ein ziemlich häufiger Anwendungsfall sein sollte. Wie funktioniert es?
Antworten:
So seltsam es auch klingen mag, wenn Sie verschachtelte Attribute zulassen möchten, geben Sie die Attribute des verschachtelten Objekts in einem Array an. In deinem Fall wäre es
Update wie von @RafaelOliveira vorgeschlagen
Wenn Sie jedoch mehrere Objekte verschachteln möchten, wickeln Sie sie in einen Hash ein
Rails haben tatsächlich eine ziemlich gute Dokumentation dazu: http://api.rubyonrails.org/classes/ActionController/Parameters.html#method-i-permit
Weitere Erläuterungen finden Sie in der Implementierung von
permit
undstrong_parameters
selbst: https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/strong_parameters.rb#L246-L247quelle
Ich fand diesen Vorschlag in meinem Fall nützlich:
Überprüfen Sie diesen Link von Xaviers Kommentar zu Github.
Dieser Ansatz listet das gesamte Objekt params [: Messung] [: Grundwahrheit] auf.
Verwenden der ursprünglichen Fragenattribute:
quelle
permit!
, um auf die Whitelist gesetzt zu werden. Andernfalls bleibt es nach dem Tippen unzulässig. In diesem Fall wäre esparams[:measurement][:groundtruth].permit!
permit!
löst diese Fehlererlaubnis ausNoMethodError (undefined method
! ' für # <Array: 0x007f80cb71ea00>): `permit!
Methode ist in nicht verfügbarArray
. Sie müssen Zugriff auf die jeweilige Klasseninstanz haben, um Zugriff zu habenpermit!
(es ist eine Weile her, daher habe ich den Klassennamen vergessen, aber erActionController::Parameters
basiert auf dieser Seite ).Zulassen eines verschachtelten Objekts:
quelle
Wenn es sich um Rails 5 handelt,
params.permit(:name, groundtruth: [:type, coordinates:[]])
funktioniert es aufgrund der neuen Hash-Notation einwandfrei.quelle