Ruby-on-Rails在销毁之前会导致名称错误

Ruby-on-Rails在销毁之前会导致名称错误,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我试图在模型上实现之前销毁。当我遵循这一点时,我要么收到一个名称错误,要么最终得到一个在销毁之前无法完成的东西。我的语法有什么问题 class Person < ActiveRecord::Base has_many :book_loans, :order => 'return_date desc' has_many :books, :through => :book_loans before_destroy errors.add_to_base "Ca

我试图在模型上实现之前销毁。当我遵循这一点时,我要么收到一个名称错误,要么最终得到一个在销毁之前无法完成的东西。我的语法有什么问题

class Person < ActiveRecord::Base

  has_many :book_loans, :order => 'return_date desc'
  has_many :books, :through => :book_loans

  before_destroy
    errors.add_to_base "Cannot delete borrower with loans" unless
                                                           book_loans.count == 0
end
不起作用

def before_destroy
  errors.add_to_base "Cannot delete borrower with loans" unless
                                                         book_loans.count == 0
end

您不能在销毁之前添加错误
,因为它们不会影响验证。您必须在验证发生之前添加错误,例如在验证之前添加

还有一些额外的回调,
在\u create上的\u validation\u之前
在\u update上的\u validation\u之前
。但是,销毁
版本上没有
,因为从未调用
保存
有效?
,所以在尝试销毁某些内容时添加验证错误是毫无意义的

换句话说:销毁前运行
,但它不会影响任何东西,因为销毁记录时不会检查验证错误

下面是一个关于实现基于特定条件阻止记录保存的方法的例子

before_destroy :require_no_book_loans

private

def require_no_book_loans
  raise ActiveRecord::RecordInvalid unless book_loans.count == 0
end
您还可以创建自己的错误类并引发该错误

仅供参考:在语法错误示例中,您应该在销毁之前向
传递一个块

before_destroy {|r|
  r.errors.add_to_base "Foo" # ...
}

那么我该如何防止一个有贷款的人的毁灭呢?所以这会引起一个错误。考虑到只有在特殊情况下才会发生异常,我是否最好阻止销毁链接在用户有贷款时出现?是的,这听起来很合理。人们仍然可以通过请求手工销毁来伪造它,但是你提出了一个错误,所以无论如何都不会被销毁。
before_destroy {|r|
  r.errors.add_to_base "Foo" # ...
}