Was macht `params.require (: person) .permit (: name ,: age)` in Rails 4?

149

Alle Beispiele für starke Parameter in Rails 4-Dokumenten werden verwendet

params.require(:person).permit(:name, :age)

Könnte jemand bitte dekonstruieren und erklären, was mit requireund permithier passiert?

Erik Trautman
quelle
3
Dieses Beispiel stammt direkt aus der Dokumentation, die erklärt, permitaber nicht require.
Erik Trautman

Antworten:

202

Das paramsin einem Controller sieht aus wie ein Hash, ist aber tatsächlich eine Instanz von ActionController::Parameters, die verschiedene Methoden wie requireund bereitstellt permit.

Die requireMethode stellt sicher, dass ein bestimmter Parameter vorhanden ist. Wenn dieser nicht angegeben wird, gibt die requireMethode einen Fehler aus. Es gibt eine Instanz von ActionController::Parametersfür den übergebenen Schlüssel zurück require.

Die permitMethode gibt eine Kopie des Parameterobjekts zurück und gibt nur die zulässigen Schlüssel und Werte zurück. Beim Erstellen eines neuen ActiveRecord-Modells werden nur die zulässigen Attribute an das Modell übergeben.

Es sieht der Whitelist sehr ähnlich, die früher in ActiveRecord-Modellen enthalten war, aber es ist sinnvoller, sie im Controller zu haben.

fünfstellig
quelle
36
Die Beschreibung von allow ist etwas abweichend: allow gibt einen weiteren Hash zurück, der nur den zulässigen Schlüssel enthält, und (dies ist kritisch) antwortet mit trueder permitted?Methode. Standardmäßig gibt eine Instanz der ActionController::ParametersKlasse falsefür " permitted?Antworten trueauf" zurück, was permitted?bedeutet, dass das Parameterobjekt für die Massenzuweisung verwendet werden kann. Andernfalls gibt die App einen ForbiddenAttributes-Fehler aus.
Sameers
3
Hat Chaining permitauf requireauch die erforderlichen Parameter in der zurückgegebene Objekt ermöglichen und beinhalten?
Dennis
Ich finde die Benennung unglücklich, da require viel mehr bedeutet, als einen zulässigen Parameter erforderlich zu machen. Die Verwendung von params.permit (: person ,: name ,: age) funktioniert nicht und generiert Fehler wie "Nicht zulässige Parameter :: utf8" für ein typisches Formular.
Damien
6

Genauer gesagt, wenn Sie z. Dabei .new(...)muss ein :personHash durch "Anfordern" angegeben werden, und der Hash der Person wird nur durch Erlaubnis akzeptiert :nameund :ageangezeigt.

Beispiel:

.new(person: { name: "Bhojendra", age: 32 }) // okay
.new(person: { name: "Rauniyar" }) // okay
.new(person: { name: "Bhojendra", other: 'asdf' }) // not okay, other not permitted
.new(person: { full_name: "Bhojendra Rauniyar" }) // not okay, full_name not permitted
.new(detail: { name: "Bhojendra", age: 32 }) // not okay, must be person
Bhojendra Rauniyar
quelle
Was not okayvisualisieren das 3. und 4. Beispiel?
p0k8_
@ p0k8_ Ich habe die Antwort bearbeitet, um das zu verdeutlichen. Diese Beispiele zeigen verschiedene Feldnamen, die nicht "erlaubt" waren.
Harry Wood