Comment puis-je valider qu'un modèle possède au moins un modèle associé utilisant des attributs imbriqués? Cela m'a rendu fou car je suis sûr qu'il me manque quelque chose de simple. Par exemple, je veux exiger qu'une liste ait toujours au moins une tâche.Valider la présence d'attributs imbriqués
class List < ActiveRecord::Base
has_many :tasks, :dependent => :destroy
accepts_nested_attributes_for :tasks, :allow_destroy => true
end
class Task < ActiveRecord::Base
belongs_to :list
end
J'ai essayé beaucoup d'options différentes.
1- ajouter une validation des listes:
def validate
if self.tasks.length < 1
self.errors[:base] << "A list must have at least one task."
end
end
mais cela vous permettra toujours de supprimer toutes les tâches d'un existant liste depuis lors de la suppression des tâches de la validation de la liste des tâches qui se passe avant sont détruits .
2- vérifier si les tâches ne sont pas marqués pour la destruction dans un rappel before_save
before_save :check_tasks
private
#look for any task which won't be deleted
def check_tasks
for t in self.tasks
return true if ! t.marked_for_destruction?
end
false
end
Pour une raison quelconque, je ne peux pas le faire pour supprimer jamais une tâche avec tout ce qui parcourt les tâches d'une liste . La même chose est vraie si je fais ce chèque en def validate
au lieu d'un rappel
3- nécessitant la présence de tâches validates_presence_of :tasks
, mais avec cela, il ne sera jamais supprimer toutes les tâches
C'est très utile, merci! –