web-dev-qa-db-fra.com

Rails - Paramètres forts avec des tableaux vides

J'envoie un tableau d'identifiants d'association, par exemple foo_ids, à mon contrôleur. Pour autoriser un tableau de valeurs, j'utilise:

params.permit(foo_ids: [])

Maintenant, le problème est que si j'envoie un tableau vide de foo_ids, le paramètre est ignoré. Au lieu d'effacer toutes les foos comme le ferait un tableau vide, l'association est laissée seule, car foo_ids n'est pas autorisé.

Cela peut être dû au fait que un tableau vide est converti en nil dans Rails et que la valeur nil est ignorée, car les paramètres forts recherchent un tableau de valeurs scalaires et non une valeur scalaire unique.

Quelqu'un peut-il suggérer un bon moyen de résoudre ce problème? Merci!

Information additionnelle

Dans une action du contrôleur de mise à jour, je dois pouvoir gérer deux cas. Je dois pouvoir définir foo_ids sur un tableau vide. Je dois aussi pouvoir ignorer foo_ids si je veux simplement mettre à jour un autre champ. Définir foo_ids sur un tableau vide si nil ne fonctionne pas pour ce second cas.

38
Rahul Sekhar

La solution temporaire à laquelle je suis arrivé est la suivante:

params[:foo_ids] ||= [] if params.has_key?(:foo_ids)
params.permit(foo_ids: [])

Ici, foo_ids est défini sur un tableau vide uniquement si est passé. S'il n'est pas transmis dans la demande, il est ignoré.

J'espère toujours trouver une meilleure solution à ce problème, car ce genre de chose sera assez courant dans le projet sur lequel je travaille. Merci de suggérer de meilleures idées si vous en avez.

19
Rahul Sekhar

C'est assez tard, mais j'ai juste eu ce problème moi-même. Je l'ai résolu en incluant à la fois la version scalaire et la version du tableau dans l'instruction permit, comme ceci:

params.require(:photo).permit(:tags, tags: [])

FYI - il a avoir les deux dans la même déclaration de permis - si vous les enchaînez, cela sera jeté pour une raison quelconque.

EDIT: Je viens de remarquer qu’un tableau vide soumis via cette méthode sera transformé en nil - j’ai maintenant un tas de champs qui devraient être des tableaux vides qui sont nuls. La solution que j'ai publiée ne fonctionne donc pas pour moi.

EDIT le deuxième: Je pensais déjà avoir ajouté cela, mais ce problème est lié au fait que Rails effectue deep_munge sur les hachages params. Ce commentaire explique comment résoudre ce problème: https://stackoverflow.com/a/25428800/130592

32
Nathan

J'ai eu le même problème récemment, mais aucune des réponses ici n'a fonctionné pour moi. Ceci est ma solution. Si vous avez du javascript qui gère les requêtes HTTP, cela peut également fonctionner pour vous.

Du côté de votre client:

if (photo.tags.length === 0){
  photo.tags = ["null"]
}

Et sur votre PhotosController

def photo_params
  p = params.require(:photo).permit(tags: [])
  p["tags"].reject! { |tag| tag == "null" }
  p
end
0
sung