2015-11-28 12 views
21

La documentazione per il metodo Phoenix scrub_params non mi è chiara. Sembra che questa funzionalità sia simile alla funzionalità dei parametri forti di Rails. Tuttavia, quando lo si utilizza in un controllore in questo modo,Gli scrub_params di Phoenix hanno parametri forti come Rails?

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

... non stai affermando esplicitamente quali parametri si desidera whitelist. Ho guardato il codice per scrub_params, ma sono abbastanza stupido con Elixir che non sono sicuro di cosa stia succedendo.

Questo metodo esamina solo il modello e utilizza gli attributi del modulo di campo obbligatorio e facoltativo per i parametri di whitelist?

Inoltre, la documentazione scrub_params dice "Controlla se è presente il tasto required_". Qual è la "chiave richiesta"? Sono solo i campi richiesti dal modello?

risposta

35

La funzione scrub_params/2 non è proprio come i parametri forti di Rails. In Ecto si definisce la chiave consentita nella funzione changeset utilizzando Ecto.Changeset.cast/4.

parametri Scrub esegue le seguenti operazioni:

  • Verificare la chiave necessaria esiste.
  • Modificare valori vuoti dalla mappa nel params con la chiave necessaria per nil

Ad esempio, la chiamata:

plug scrub_params "user" 

controllerà per la presenza di una chiave "utente". Da the docs:

Se il tasto required_ non è presente, verrà generato Phoenix.MissingParamError.

Se si dispone di una mappa params che assomiglia a:

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

Poi il parametro di "età" sarebbe stato convertito in nil. Questo consente di chiamare la funzione di modifiche direttamente con i params:

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

Il scrub_params/2 è completamente estranei al modello, funziona solo bene con Ecto poiché la funzione Ecto.Changeset.cast/4 prende un set di campi obbligatori e una serie di optional campi. Il passaggio di nil a un campo obbligatorio invaliderà il changeset e aggiungerà un errore per il campo.

+0

Grazie per il chiarimento. Ciò ha senso. –

+0

Allora, qual è l'equivalente dei parametri forti di Phoenix? Devo limitare l'input dell'utente. Apprezzo una risposta [alla mia domanda qui.] (Http://stackoverflow.com/questions/39938824/elixir-phoenix-restrict-params-like-rails-strong-params) Grazie. –