J'ai une question assez simple. Mais je n'ai pas encore trouvé de solution.
Voici donc la chaîne JSON que j'envoie au serveur:
{
"name" : "abc",
"groundtruth" : {
"type" : "Point",
"coordinates" : [ 2.4, 6 ]
}
}
En utilisant la nouvelle méthode de permis, j'ai:
params.require(:measurement).permit(:name, :groundtruth)
Cela ne génère aucune erreur, mais l'entrée de base de données créée contient null
au lieu de la valeur groundtruth.
Si je viens de définir:
params.require(:measurement).permit!
Tout est enregistré comme prévu, mais bien sûr, cela tue la sécurité fournie par des paramètres forts.
J'ai trouvé des solutions, comment autoriser les tableaux, mais pas un seul exemple utilisant des objets imbriqués. Cela doit être possible d'une manière ou d'une autre, car cela devrait être un cas d'utilisation assez courant. Alors, comment ça marche?
Réponses:
Aussi étrange que cela puisse paraître lorsque vous souhaitez autoriser des attributs imbriqués, vous spécifiez les attributs d'objet imbriqué dans un tableau. Dans votre cas, ce serait
Mettre à jour comme suggéré par @RafaelOliveira
D'un autre côté, si vous voulez imbriquer plusieurs objets, vous l'enveloppez dans un hachage ... comme ça
Rails a en fait une assez bonne documentation à ce sujet: http://api.rubyonrails.org/classes/ActionController/Parameters.html#method-i-permit
Pour plus de précisions, vous pouvez regarder l'implémentation de
permit
etstrong_parameters
lui - même: https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/strong_parameters.rb#L246-L247la source
J'ai trouvé cette suggestion utile dans mon cas:
Consultez ce lien du commentaire de Xavier sur github.
Cette approche met en liste blanche l'ensemble de l'objet params [: mesure] [: groundtruth].
Utilisation des attributs de questions d'origine:
la source
permit!
pour être mis sur la liste blanche, sinon il est resté non autorisé après l'avoir tapé. Dans ce cas, ce seraitparams[:measurement][:groundtruth].permit!
permit!
soulève ceNoMethodError (undefined method
permis d' erreur ! ' for # <Array: 0x007f80cb71ea00>): `permit!
méthode @wuliwong n'est pas disponible dansArray
. Vous devrez avoir accès à l'instance de classe respective pour y avoir accèspermit!
(cela fait un moment que j'ai oublié le nom de la classe mais c'est quelque chose commeActionController::Parameters
basé sur cette page ).Autoriser un objet imbriqué:
la source
Si c'est Rails 5, à cause de la nouvelle notation de hachage:
params.permit(:name, groundtruth: [:type, coordinates:[]])
fonctionnera bien.la source