Que fait `params.require (: person) .permit (: name,: age)` dans Rails 4?

149

Tous les exemples de paramètres forts de la documentation Rails 4 utilisent

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

Quelqu'un pourrait-il s'il vous plaît déconstruire et expliquer ce qui se passe avec requireet permitici?

Erik Trautman
la source
3
Cet exemple provient directement de la documentation, qui explique permitmais pas require.
Erik Trautman

Réponses:

202

Le paramsdans un contrôleur ressemble à un Hash, mais c'est en fait une instance de ActionController::Parameters, qui fournit plusieurs méthodes telles que requireet permit.

La requireméthode garantit qu'un paramètre spécifique est présent et, s'il n'est pas fourni, la requireméthode renvoie une erreur. Il renvoie une instance de ActionController::Parameterspour la clé transmise require.

La permitméthode renvoie une copie de l'objet de paramètres, retournant uniquement les clés et valeurs autorisées. Lors de la création d'un nouveau modèle ActiveRecord, seuls les attributs autorisés sont transmis au modèle.

Cela ressemble beaucoup à la liste blanche qui était auparavant incluse dans les modèles ActiveRecord, mais il est plus logique qu'elle soit dans le contrôleur.

cinq chiffres
la source
37
La description de permit est un peu fausse: permit retourne un autre hachage qui ne contient que la clé autorisée ET (c'est critique) répondra trueà la permitted?méthode. Par défaut, une instance de la ActionController::Parametersclasse retournera falsepour permitted?Répondre trueà permitted?signifie que l'objet paramètre peut être utilisé dans l'affectation en masse; sinon, l'application lancera une erreur ForbiddenAttributes.
sameers
3
N'enchaînant permitsur requirepermettre également et inclure les paramètres requis dans l'objet retourné?
Dennis
Je trouve la dénomination malheureuse, car require fait bien plus que rendre obligatoire un paramètre autorisé. L'utilisation de params.permit (: personne,: nom,: âge) ne fonctionne pas et génère des erreurs comme «Paramètres non autorisés:: utf8» pour un formulaire typique.
Damien
6

Pour être plus précis, lorsque vous créez par exemple. En faisant .new(...), il doit y avoir un :personhash indiqué par require et la personne hash n'acceptera :nameet sera :ageindiqué que par permit.

Exemple:

.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
la source
Que not okayvisualisent les 3e et 4e exemples?
p0k8_
@ p0k8_ J'ai modifié la réponse pour clarifier cela. Ces exemples montrent des noms de champs différents qui n'étaient pas «autorisés».
Harry Wood