it-swarm.com.de

Schienen 4 - Starke Parameter - Verschachtelte Objekte

Ich habe eine ziemlich einfache Frage. Aber bisher keine Lösung gefunden.

Hier ist der JSON-String, den ich an den Server schicke:

{
  "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 anstelle des Bodentruth-Werts null.

Wenn ich gerade eingestellt habe:

params.require(:measurement).permit!

Alles wird wie erwartet gespeichert, aber das bringt die Sicherheit, die durch starke Parameter geboten wird.

Ich habe Lösungen gefunden, wie man Arrays zulässt, aber kein einziges Beispiel mit verschachtelten Objekten. Das muss irgendwie möglich sein, da es ein ziemlich üblicher Anwendungsfall sein sollte. Wie funktioniert es?

126
Benjamin M

So seltsam es auch klingen mag, wenn Sie verschachtelte Attribute zulassen möchten, geben Sie die Attribute von verschachtelten Objekten in einem Array an. In deinem Fall wäre es so

Update wie von @RafaelOliveira vorgeschlagen

params.require(:measurement)
      .permit(:name, :groundtruth => [:type, :coordinates => []])

Wenn Sie dagegen mehrere Objekte verschachteln möchten, packen Sie sie in einen Hash… so

params.require(:foo).permit(:bar, {:baz => [:x, :y]})


Rails haben tatsächlich eine ziemlich gute Dokumentation dazu: http://api.rubyonrails.org/classes/ActionController/Parameters.html#method-i-permit

Zur weiteren Erläuterung können Sie sich die Implementierung von permit und strong_parameters selbst ansehen: https://github.com/Rails/rails/blob/master/actionpack/lib/action_controller/metal/strong_parameters.rb#L246-L247

165
j03w

Ich fand diesen Vorschlag in meinem Fall nützlich:

  def product_params
    params.require(:product).permit(:name).tap do |whitelisted|
      whitelisted[:data] = params[:product][:data]
    end
  end

Überprüfen Sie dieses link von Xaviers Kommentar zu github.

Dieser Ansatz führt das gesamte params [: Measurement] [: Groundtruth] -Objekt auf die Whitelist.

Verwenden der ursprünglichen Fragenattribute:

  def product_params
    params.require(:measurement).permit(:name, :groundtruth).tap do |whitelisted|
      whitelisted[:groundtruth] = params[:measurement][:groundtruth]
    end
  end
20
M.ElSaka

Ein verschachteltes Objekt zulassen:

params.permit( {:school => [:id , :name]}, 
               {:student => [:id, 
                            :name, 
                            :address, 
                            :city]},
                {:records => [:marks, :subject]})
6
Codiee

Wenn es sich um Rails 5 handelt, funktioniert aufgrund der neuen Hash-Notation: params.permit(:name, groundtruth: [:type, coordinates:[]]) einwandfrei.

0
user8164115