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" # ...
}