2010-07-17 6 views
1

J'essaie de valider un champ en fonction des attributs du modèle associé. regardant le code plus logique (je l'espère)reverse validates_associated

class User < ActiveRecord::Base 
    has_and_belongs_to_many :user_groups 
    has_one :profile, :dependent => :destroy 

    accepts_nested_attributes_for :profile 
    validates_associated \ 
    :profile, 
    :allow_destroy => true 
end 


class Profile < ActiveRecord::Base 
    belongs_to :user 

    validates_presence_of \ 
    :business_name, 
    :if => self.user.user_groups.first.name == 'Client' 
end 

lorsque je soumets le formulaire pour créer un nouvel utilisateur, je reçois

undefined method `user_groups' for nil:NilClass 

Fondamentalement, je ne veux que pour valider la présence du champ business_name si je crée un nouveau client.

i ont également essayé d'utiliser

:if => Proc.new { |p| p.user.user_groups.first.name == 'Clients' } 

avec les mêmes résultats.

peut-être que j'aboie complètement le mauvais arbre, mais des suggestions sur la réalisation de cela?

Répondre

1

Vous avez une association belongs_to qui prend user_id et trouve l'objet User avec cet ID. Cependant, votre modèle de profil est en cours de validation avant que votre utilisateur ne soit enregistré, il n'a donc pas d'identifiant. Votre validation dans Profil ne peut pas encore être appelée dans l'utilisateur.

Vous devez démêler cette logique pour qu'elle soit déclenchée dans l'utilisateur ou dans le profil, mais le profil ne peut pas attendre qu'un utilisateur créé fasse sa propre validation si vous voulez d'abord valider le profil.

Ceci est un problème de poulet et d'oeuf.

Vous pouvez résoudre ce problème en ajoutant une colonne comme is_business profil et changer votre code comme suit:

class Profile < ActiveRecord::Base 
    belongs_to :user 

    validates_presence_of \ 
    :business_name, 
    :if => is_business? 
end 

et mettre à jour votre formulaire de profil pour définir is_business correctement dans le contexte.

+0

hmm ... il peut ne pas être possible alors jusqu'à ce que validates_associated accepte des paramètres? – brewster

+0

Votre logique est alambiquée ici. J'ai mis à jour ma réponse originale pour montrer comment vous pouvez découpler la logique de validation dans Profile à autonome. Vous devrez passer l'indicateur is_business pour déclencher les validatoins d'entreprise spéciales sur votre profil. – Winfield