2016-10-13 1 views
1

J'ai validation avec Proc et problème avec elleproblème de validation en utilisant plusieurs objets Proc

validates :subcategory, presence: true, 
if: Proc.new {|product| product.detail.blank?} && Proc.new { |product| product.category.id != 16 } 

Mon problème est quand j'ai true deuxième proc mes feux de validation.

Pourquoi est-ce vrai? Ne devrait-il pas retourner false parce que false && true=>false?

Répondre

4

D'autres ont commenté de meilleures façons de mettre en œuvre ce que vous voulez. Je vais juste souligner le malentendu que vous avez.

il doit retourner false parce false && true => false

Non. En fait, c'est Proc && Proc => Proc (proc1 && proc2 => proc2). Donc, votre premier proc est ignoré en raison du fonctionnement de l'opérateur && (cela arrive au moment du chargement de la classe) et n'est jamais appelé, pas même une fois.

+2

et ce serait une vraie réponse à la question –

+0

@ sergio-tulentsev Pouvez-vous expliquer comment il est ignoré à 'class loading time'? – dnsh

+0

@Dinesh: cette expression ('Proc && Proc') est évaluée lorsque le fichier avec cette classe est chargé. Puisque c'est une partie de l'appel 'validates', qui est une expression de niveau classe. Et oui, cela signifie que 'validates' ne sera jamais appelé de nouveau (puisque la classe est déjà chargée) (* J'ignore le rechargement de la classe de mode dev des rails ici non pertinent *). –

5

Je pense que vous feriez mieux d'utiliser seul objet proc:

validates :subcategory, 
    presence: true, 
    if: Proc.new { |product| product.detail.blank? && product.category.id != 16 } 
+0

Est-ce que 'product.category_id' ne serait pas meilleur, il ne explosera pas s'il n'y a pas de catégorie et n'aura pas besoin de charger la catégorie à partir de la base de données. –

+0

@ j-dexx il serait en effet, je ne voulais tout simplement pas modifier le code OP autant :) –

2

Je vous recommande l'utilisation d'une méthode: si.

validates :subcategory, presence: true, if: :my_cond? 

def my_cond? 
    detail.blank? && category.id != 16 
end 

Cela rend votre code plus propre. Si vous trouvez vraiment bon nom pour la méthode my_cond? alors votre code sera plus lisible.

+0

pas besoin de 'self' :) –

+0

@AndreyDeineko Yup. – dnsh