2009-10-05 7 views
0

J'ai une forme complexe pour mon modèle de travail. Il accepte les attributs imbriqués pour les crédits, les images et les vidéos. (Il est une version modifiée de l'exemple de forme complexe de Eloy Duran)Rails Formulaire complexe Validations?

  • Je veux valider la présence d'au moins un crédit
  • Je veux valider la présence d'au moins une image ou une vidéo

quand je fais (en work.rb):

validates_presence_of :credits 

il valide correctement lorsque je tente de soumettre le formulaire sans crédits, mais il ne vérifie pas si je supprime le dernier crédit (par Checki ng check_box qui ajoute "_delete" aux attributs du crédit). Il soumet le travail en supprimant le seul et unique crédit quittant l'œuvre sans aucun crédit.

Avez-vous une idée sur comment je peux les valider correctement?

Répondre

2

Qu'est-ce que vous avez besoin est quelque chose le long des lignes de:

validate :credits_present 

private 

    def credits_present 
    unless credits.any?{|c| !c.marked_for_destruction? } 
     errors.add_to_base "You must provide at least one credit" 
    end 
    end 

Le conditionnel à credits_present peut être un peu en désordre alors laissez-moi le décomposer juste au cas où vous ne suivez pas. La méthode any? renvoie true si l'un des éléments du Enumerable répond true au bloc fourni. Dans ce cas, nous vérifions que l'élément ne va pas être supprimé. Donc, si l'un des crédits ne va pas être supprimé, nous obtenons true. Si true, nous sommes en bonne forme, nous avons au moins un crédit qui ne sera pas supprimé. Si, d'un autre côté, nous obtenons false, soit nous savons qu'il n'y a pas de crédits ou que ceux qui sont présents seront supprimés. Dans ce cas, la validation échoue et nous ajoutons l'erreur.

+0

Merci Peter, marked_for_destruction est ce que je cherchais, mais le? méthode que vous avez utilisée est juste géniale. – fahrio

+0

cool, beau travail peter. – klochner

-2

Essayez d'utiliser before_save dans work.rb


before_save :check_credits 

private 
def check_credits 
    self.credits > 0 
end 

Si les crédits sont < = zéro, la sauvegarde ne passera pas par.

+2

Non, cela ne fonctionne pas. Je pense que le problème est que comme le crédit est marqué pour la suppression avec une valeur de case à cocher cachée étant mis à 1 avant la sauvegarde, le crédit existe toujours jusqu'à ce que la sauvegarde est terminée. Donc self.credits.size> 0 ou self.credits.blank? ne fera pas le travail. Si je pouvais accéder au paramètre _delete des crédits soumis, je pourrais arrêter la sauvegarde, mais je ne peux pas trouver un moyen d'accéder à cet attribut à partir du modèle. – fahrio

+0

fahrio est exactement sur le problème. –