2015-11-28 6 views
21

Die Dokumentation für die Phoenix scrub_params Methode ist mir etwas unklar. Es sieht so aus, als ob diese Funktionalität der Funktion für starke Parameter von Rails ähnelt. Allerdings, wenn Sie es in einem Controller wie so verwenden,Sind die scrub_params von Phoenix wie starke Parameter von Rails?

plug :scrub_params, "user" when action in [:create] 

... Sie sind nicht explizit angegeben ist, welche Parameter Sie die weiße Liste setzen wollen. Ich habe für scrub_params auf den Code gesucht, aber ich bin noobish genug mit Elixir, dass ich nicht ganz sicher bin, was los ist.

Betrachtet diese Methode nur das Modell und verwendet die erforderlichen und optionalen Feldmodulattribute für Whitelisting-Parameter?

Auch die scrub_params Dokumentation sagt es "Überprüft, ob der required_key vorhanden ist". Was ist der "erforderliche Schlüssel"? Sind das nur die benötigten Felder aus dem Modell?

Antwort

35

Die Funktion ist nicht wirklich wie starke Parameter von Rails. In Ecto definieren Sie den zulässigen Schlüssel in Ihrer Changeset-Funktion mit Ecto.Changeset.cast/4.

Scrub-Parameter führt Folgendes aus:

  • Sicherstellen, dass die erforderlichen Schlüssel vorhanden ist.
  • ändern leere Werte aus der Karte in params mit dem erforderlichen Schlüssel zum nil

Zum Beispiel rufen:

plug scrub_params "user" 

Wird auf das Vorhandensein eines „user“ Schlüssel überprüfen. Von the docs:

Wenn der required_key nicht vorhanden ist, wird Phoenix.MissingParamError ausgelöst.

Wenn Sie eine params Karte haben, die wie folgt aussieht:

%{"user" => %{"name" => "foo", "age" => ""}} 

Dann wird das "Alter" Parameter nil umgewandelt werden würde. Auf diese Weise können Sie Ihre changeset Funktion direkt mit dem params nennen:

def create(conn, %{"user" => user_params}) do 
    User.changeset(user_params) 
end 

Die scrub_params/2 zu Ihrem Modell völlig unabhängig ist, es funktioniert nur gut mit Ecto da die Ecto.Changeset.cast/4 Funktion eine Reihe von Pflichtfeldern und eine Reihe von optionalen nimmt Felder. Wenn Sie nil an ein erforderliches Feld übergeben, wird der Änderungssatz ungültig und ein Fehler für das Feld hinzugefügt.

+0

Danke zur Klärung. Das macht Sinn. –

+0

Was ist also mit starken params in Phoenix gleichzusetzen? Ich muss die Benutzereingaben einschränken. Schätzen Sie eine Antwort [auf meine Frage hier.] (Http://stackoverflow.com/questions/39938824/elixir-phoenix-restrict-params-like-rails-strong-params) Vielen Dank. –