157 votes

Rails - Paramètres forts - Objets imbriqués

J'ai une question assez simple. Mais je n'ai pas trouvé de solution jusqu'à présent.

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)

Cette opération ne provoque aucune erreur, mais l'entrée de la base de données créée contient null au lieu de la valeur de référence.

Si je mets juste :

params.require(:measurement).permit!

Tout est sauvegardé comme prévu, mais bien sûr, cela annule la sécurité fournie par les 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, puisque cela devrait être un cas d'utilisation assez courant. Alors, comment cela fonctionne-t-il ?

197voto

j03w Points 1268

Aussi étrange que cela puisse paraître, lorsque vous voulez autoriser des attributs imbriqués, vous spécifiez les attributs des objets imbriqués dans un tableau. Dans votre cas, ce serait

Mise à jour comme suggéré par @RafaelOliveira

params.require(:measurement)
      .permit(:name, :groundtruth => [:type, :coordinates => []])

D'un autre côté, si vous voulez imbriquer plusieurs objets, vous les placez dans un hash comme ceci

params.require(:foo).permit(:bar, {:baz => [:x, :y]})

Rails dispose en fait d'une assez bonne documentation à ce sujet : http://api.rubyonrails.org/classes/ActionController/Parameters.html#method-i-permit

Pour plus de clarté, vous pouvez examiner l'implémentation de permit y strong_parameters lui-même : https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/strong_parameters.rb#L246-L247

25voto

M.ElSaka Points 463

J'ai trouvé cette suggestion utile dans mon cas :

  def product_params
    params.require(:product).permit(:name).tap do |whitelisted|
      whitelisted[:data] = params[:product][:data]
    end
  end

Vérifiez ceci lien du commentaire de Xavier sur github.

Cette approche permet de blanchir l'ensemble de l'objet params[:measurement][:groundtruth].

En utilisant les attributs des questions originales :

  def product_params
    params.require(:measurement).permit(:name, :groundtruth).tap do |whitelisted|
      whitelisted[:groundtruth] = params[:measurement][:groundtruth]
    end
  end

11voto

Codiee Points 1160

Autoriser un objet imbriqué :

params.permit( {:school => [:id , :name]}, 
               {:student => [:id, 
                            :name, 
                            :address, 
                            :city]},
                {:records => [:marks, :subject]})

2voto

user8164115 Points 21

Si c'est Rails 5, à cause de la nouvelle notation de hachage : params.permit(:name, groundtruth: [:type, coordinates:[]]) fonctionnera parfaitement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X