2009-12-09 80 views
0

我有一个名为Tickets的模型即使在 无效时也会保存到数据库中。这阻止了我使用验证来帮助防止 重复数据被保存到数据库。在脚本/控制台数据库中的Rails对象无效

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

如果我尝试看看有什么错误与此无效的对象关联

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

因此,没有人知道它是如何可能一个无效的对象保存到 数据库,以及如何我能找到使对象无效的内容吗?

Ticket.rb(型号)这个问题的

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 

,一部分回答,第二个不是。任何人都可以看到这个模型的问题,可以让它保存,即使它是无效的?

回答

1

可以跳过验证。你怎么保存它?它是嵌套表单的一部分吗?

在任何情况下,你应该看看这样的错误:

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

你有它上面的方式,你正在与第二Ticket.last呼叫和验证一个新的对象一直没有运行那个,所以你不能看到错误是什么。

+0

这是完全有道理的,它说,我有一个电子邮件地址,我期望(我不希望任何电子邮件保存有相同的,从,和身体)的错误。我的模型有什么问题可以保存,即使无效? 我通过Ticket.create保存在动作邮件收件方法中。 – Schneems 2009-12-09 15:46:16

+0

我想知道它是否通过某种计时器保存后失效。 validates_uniqueness_of不是100%可靠的。我建议在数据库中添加一个约束。 – MattMcKnight 2009-12-10 05:40:36

0

试着这么做:

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

的错误对象将不被填充,直到您尝试保存ActiveRecord的对象。