我正在尝试在模型上实现 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
答案 0 :(得分:6)
您无法添加错误before_destroy
,因为它们不会影响验证。您必须在验证发生之前添加错误,例如before_validation
。
还有一些额外的回调,before_validation_on_create
和before_validation_on_update
。但是,没有on_destroy
版本,因为永远不会调用save
和valid?
,因此当您尝试销毁某些内容时添加验证错误将毫无意义。
换句话说:您的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" # ...
}