2009-12-09 4 views
0

J'ai un modèle nommé Tickets qui est enregistré dans la base de données même lorsque n'est pas valide. Cela m'empêche d'utiliser des validations pour empêcher que des données dupliquées soient enregistrées dans la base de données en tant que . Dans script/consoleL'objet Rails dans la base de données est invalide

>> Ticket.last.valid? 
=> False 
>> Ticket.first.valid? 
=> False 

Si j'essaie de voir quelles erreurs sont associées à cet objet invalide

>> Ticket.last.errors.each{|attr,msg| puts "#{attr} - #{msg}\n" } 
=> {} 

Cela veut-il que quelqu'un sait comment il est possible d'enregistrer un objet non valide à la base de données , et comment puis-je trouver ce qui rend l'objet invalide?

Ticket.rb (modèle)

class Ticket < ActiveRecord::Base 

    belongs_to :whymail 
    belongs_to :forms 

    attr_accessible :to_email, :to_email, :from_email, :subject, :body 


    validates_uniqueness_of :to_email, :scope => [:body, :from_email] 
    validates_presence_of  :to_email 
    validates_presence_of  :from_email 
    validates_presence_of  :subject 
    validates_presence_of  :body 



    def after_create 

    if self.valid? 
     whymail = Whymail.find(:first, :include => :user, :conditions => ['(email = ?)', self.to_email.upcase ])  
     if !whymail.nil? 
     self.whymail_id = whymail.id 
     self.save 
     MyMailer.deliver_forward(whymail.user.email, self.from_email, self.to_email, self.subject, self.body)   
     end 
    end 
    end 

end 

Une partie de cette question a été répondu, deuxième était pas. Quelqu'un peut-il voir des problèmes avec ce modèle qui peut lui permettre d'enregistrer même si elle est invalide ??

Répondre

1

Il est possible d'ignorer les validations. Comment l'enregistrez-vous? Fait-il partie d'un formulaire imbriqué?

Dans tous les cas, vous devriez regarder les erreurs comme celle-ci:

>>t = Ticket.last 
>>t.valid? 
>>t.errors.each{|attr,msg| puts "#{attr} - #{msg}\n" } 

La façon dont vous avez ci-dessus, vous obtenez un nouvel objet avec le deuxième appel et la validation Ticket.last n'a pas été courir sur celui-là, de sorte que vous ne pouvez pas voir quelles sont les erreurs.

+0

Tout à fait logique, il dit que j'ai une erreur sur l'adresse e-mail que je m'attendrais (je ne veux pas les e-mails enregistrés qui ont le même, de, et le corps). Y a-t-il quelque chose qui ne va pas dans mon modèle qui lui permet d'économiser même s'il est invalide? Je sauvegarde via Ticket.create à l'intérieur d'une méthode de réception d'action mailer. – Schneems

+0

Je me demande si elle est devenue invalide après avoir été sauvegardée via une sorte de timing. validates_uniqueness_of n'est pas fiable à 100%. Je recommande de mettre également une contrainte dans la base de données. – MattMcKnight

0

Essayez quelque chose comme:

t = Ticket.last 
t.save 
puts t.errors.full_messages.inspect 

Les erreurs objet ne sera pas rempli jusqu'à ce que vous essayez d'enregistrer l'objet activerecord.

Questions connexes