2010-06-10 2 views
0

J'utilise beaucoup de mes propres méthodes de validation pour comparer les données d'une association à l'autre. J'ai remarqué que je vérifie constamment que mes associations ne sont pas nulles avant d'essayer d'appeler quoi que ce soit sur eux, mais je valide aussi leur présence, et donc je sens que mes chèques nuls sont redondants. Voici un exemple:Est-il possible de grouper la validation?

class House < ActiveRecord::Base 
    has_one :enterance, :class => Door 
    has_one :exit, :class => Door 

    validates_presence_of :enterance, :exit 

    validate :not_a_fire_hazard 
    def not_a_fire_hazard 
    if enterance && exit && enterance.location != exit.location 
     errors.add_to_base('If there is a fire you will most likely die') 
     return false 
    end 
    end 
end 

Je me sens comme je me répète en vérifiant l'existence de enterance et de sortie dans mon propre validation.

Y a-t-il plus de "The Rails Way" à faire?

Répondre

0

Vous pouvez également envisager d'utiliser la strophe validates_associated afin de valider si les objets associés sont eux-mêmes valides. En outre, une autre façon plus propre pour aller de l'avant et faire en sorte que les deux entrée et de sortie sont présents (non nul) serait le suivant:

validates_presence_of :entrance_or_foo 

def entrance_or_foo 
    entrance and foo 
end 

Ensuite, vous pouvez nettoyer votre méthode de risque d'incendie pour ressembler à ce qui suit:

def not_a_fire_hazard 
    if enterance.location != foo.location 
     errors.add_to_base('If there is a fire you will most likely die') 
    end 
end 

Vous n'avez pas besoin du retour false dans la définition ci-dessus.

Comme noté par François dans les commentaires, exit est une méthode définie dans le module Kernel. Vous devez renommer votre classe afin d'éviter toute confusion avec la méthode de sortie définie par Ruby. J'ai renommé les instances de sortie en foo dans mon exemple de code ci-dessus.

+2

l'entrée et la sortie quitteraient le processus serveur. exit est une méthode sur le noyau qui arrête la machine virtuelle. Ooops –

+0

+1 François, j'ai omis de le mentionner dans mon post. Je pense que l'idée est toujours là. – randombits

+0

Woops à la sortie, c'était juste un exemple que j'ai inventé. Je ne suis pas sûr de savoir comment cela va résoudre mon problème, comme si not_a_fire_hazard est dans la chaîne de validation, et entrée ou foo est nul, je vais toujours faire nil.location. Puisque la validation est simultanée (peut-être ne le sera-t-il pas dans ce cas?), Même si entry_or_foo ne passe pas, not_a_fire_hazard ne sera-t-il pas encore appelé? – lambdabutz

Questions connexes