2017-01-04 1 views
0

J'essaie d'autoriser un hachage avec certaines valeurs ou une valeur nulle à l'aide de paramètres forts. J'ai maintenant ce qui suit:Autoriser le hachage ou zéro avec des paramètres forts

params.require(:parent).permit(child: [:attr1, :attr2]) 

Si j'appelle cette action avec:

{ "parent": { "child": nil }} 

Rails ne permet pas le paramètre enfant. (Unpermitted parameter: child)

Comment puis-je convaincre les rails que nil et un hachage sont autorisés? Je sais que vous pouvez autoriser des valeurs nulles en faisant:

params.require(:parent).permit(:child, child: [:attr1, :attr2]) 

Mais cela permet également des valeurs de chaîne.

+0

Essayez-vous d'autoriser une entrée de hachage ou d'accepter des ressources imbriquées? ce sont des cas d'utilisation très différents – TheRealMrCrowley

Répondre

2

La meilleure chose à faire ici, je pense, est de permettre à toutes les valeurs en faisant ceci:

params.require(:parent).permit(:child) 

Ce devrait rien laisser passer, voire nul, mais vérifiez le type en écrivant votre propre coutume validation.

validate :child_is_nil_or_hash 
... 
def child_is_nil_or_hash 
    unless child.is_a?(Hash) || child.nil? 
    errors.add(:child, 'must be nil or a hash') 
    end 
end 

ou quelque chose à cet effet. Je n'ai pas testé ce code correctement.

Dans cet exemple, vous éloignez la responsabilité de la validation de la liste blanche des paramètres et des validations Rails auxquelles elle appartient.

+0

C'est exactement la même solution que 'params.require (: parent) .permit (: enfant, enfant: [: attr1,: attr2])' seulement plus dangereux, car il permet n'importe quel attribut dans le hacher. – Roy

+0

@Roy: avez-vous trouvé une solution à cela? – thiebo

+0

@Roy c'est la bonne réponse. Les paramètres forts consistent à définir les clés qui devraient être autorisées. ce n'est absolument pas plus dangereux. les validations de ce qui est autorisé pour cette clé se trouvent maintenant dans les validations du modèle où elle est supposée être. dans le code qu'il a posté ci-dessus, tout autre chose qu'une entrée de hachage ou une valeur nulle jettera une erreur – TheRealMrCrowley