Cosa sta facendo `params.require (: person) .permit (: name,: age)` in Rails 4?


149

Tutti gli esempi di parametri forti utilizzati nei documenti di Rails 4

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

Qualcuno potrebbe per favore decostruire e spiegare cosa sta succedendo requiree permitqui?


3
Questo esempio viene direttamente dalla documentazione, che spiega permitma non require.
Erik Trautman,

Risposte:


202

In paramsun controller sembra un hash, ma in realtà è un'istanza di ActionController::Parameters, che fornisce diversi metodi come requiree permit.

Il requiremetodo garantisce la presenza di un parametro specifico e, se non viene fornito, requiregenera un errore. Restituisce un'istanza di ActionController::Parametersper la chiave passata require.

Il permitmetodo restituisce una copia dell'oggetto parametri, restituendo solo le chiavi e i valori consentiti. Quando si crea un nuovo modello ActiveRecord, nel modello vengono passati solo gli attributi consentiti.

Assomiglia molto alla whitelisting precedentemente inclusa nei modelli ActiveRecord, ma ha più senso che sia nel controller.


37
La descrizione del permesso è un po 'spenta: il permesso restituisce un altro hash che contiene solo la chiave consentita E (questo è fondamentale) risponderà con trueil permitted?metodo. Per impostazione predefinita, un'istanza della ActionController::Parametersclasse tornerà falseper permitted?Risposta trueper permitted?indicare che l'oggetto parametro può essere utilizzato nell'assegnazione di massa; altrimenti l'app genererà un errore ForbiddenAttributes.
stessi

3
Fa concatenamento permitsu requireanche permettere e includere i parametri richiesti nel oggetto restituito?
Dennis,

Trovo la denominazione sfortunata, in quanto richiede molto di più che rendere richiesto un parametro consentito. L'uso di params.permit (: person,: name,: age) non funziona e genera errori come "Parametri non ammessi:: utf8" per un modulo tipico.
Damien,

6

Per essere più precisi, quando crei per es. facendo .new(...), ci deve essere l' :personhash indicato da request e l'hash della persona accetterà :namee :ageindicato solo dal permesso.

Esempio:

.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

Cosa visualizzano il 3o e il 4o not okayesempio?
p0k8_

@ p0k8_ Ho modificato la risposta per chiarirlo. Questi esempi mostrano alcuni nomi di campi diversi che non erano "consentiti".
Harry Wood,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.