Ruby on Rails before_destroy导致NameError

时间:2009-09-25 19:11:03

标签: ruby-on-rails activerecord

我正在尝试在模型上实现 before_destroy 。当我关注这个before_destroy example时,我会收到一个NameError,或者最终得到一些不能执行 before_destroy 的东西。我的语法出了什么问题?

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

不编译

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

不起作用

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

1 个答案:

答案 0 :(得分:6)

您无法添加错误before_destroy,因为它们不会影响验证。您必须在验证发生之前添加错误,例如before_validation

还有一些额外的回调,before_validation_on_createbefore_validation_on_update。但是,没有on_destroy版本,因为永远不会调用savevalid?,因此当您尝试销毁某些内容时添加验证错误将毫无意义。

换句话说:您的before_destroy运行,但它不会影响任何内容,因为在销毁记录时没有任何内容会检查验证错误。

以下是实施某些内容以防止基于特定条件保存记录的一种方法。

before_destroy :require_no_book_loans

private

def require_no_book_loans
  raise ActiveRecord::RecordInvalid unless book_loans.count == 0
end

你也可以创建自己的错误类并提高它。

仅供参考:你应该在语法错误示例中将一个块传递给before_destroy

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