【问题标题】:Rails Object in Database is Invalid数据库中的 Rails 对象无效
【发布时间】:2009-12-09 15:18:03
【问题描述】:

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

>> 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

这个问题的一部分得到了回答,第二部分没有。任何人都可以看到这个模型的问题,即使它是无效的,它也可能允许它保存??

【问题讨论】:

    标签: ruby-on-rails database validation


    【解决方案1】:

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

    在任何情况下,您都应该像这样查看错误:

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

    按照上面的方式,您将通过第二次 Ticket.last 调用获得一个新对象,并且尚未在该对象上运行验证,因此您看不到错误是什么。

    【讨论】:

    • 这完全有道理,它表示我的电子邮件地址有错误,这是我所期望的(我不希望保存任何具有相同收件人、发件人和正文的电子邮件)。我的模型是否有问题,即使无效也可以保存?我通过 Ticket.create 在动作邮件接收方法中保存。
    • 我想知道它是否在通过某种计时东西保存后变得无效。 validates_uniqueness_of 不是 100% 可靠的。我建议在数据库中也放置一个约束。
    【解决方案2】:

    尝试类似:

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

    在您尝试保存 activerecord 对象之前,不会填充错误对象。

    【讨论】:

      猜你喜欢
      • 2015-07-28
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多