2016-06-14 253 views

回答

17

您应该返回false

Rails的5

“取消回调

如果before_ *回调抛出:中止,所有后来的回调和相关动作被取消。”

轨道4,下

“取消回调

如果before_ *回调返回false,所有后来的回调和相关动作被取消。回调通常是在顺序运行它们被定义,在模型中被定义为方法的回调的例外,这被称为last。“

Source

+4

使用Rails 5,返回false不再起作用。应该抛出(:中止)'以防止删除记录。看到[这个评论](http://stackoverflow.com/questions/123078/how-do-i-validate-on-destroy-in-rails#comment59333149_123190) – RFVoltolini

+0

谢谢,我已经更新了我的答案,以帮助新人。 – Leito

+1

感谢您指定:Rails 5的中止技术。应该真的帮助我。 – CanadaIT

2

导轨包裹保存,并在交易破坏,所以在回调raise将工作:

class Post < ActiveRecord::Base 
    before_destroy :saveable? 

    def saveable? 
    if true 
     raise "Destroy aborted; you can't do that!" 
    end 
    end 
end 

替代true你的病情。

下面是删节控制台输出:

[1] pry(main)> Post.first.id 
=> 1 
[2] pry(main)> Post.first.destroy 
RuntimeError: Destroy aborted; you can't do that! 
[3] pry(main)> Post.first.id 
=> 1 

Documentation

+0

thnks,但不希望它引发任何事情......什么都不做 –

+0

有道理。因为这是'before_ *'回调函数,所以'raise'或'false'都可以。 “提升”的好处是你会得到一个明确的信息,你可以在日志中追踪,而不是“摧毁”悄悄地没有发生。选择哪个取决于您的失败情况可能会如何意外。 –

+1

在Rails 5中,你将不得不明确地提出:中止。你现在可以开始了。 – mwoods79

1

您也可以覆盖#destroy方法:

def destroy 
    study_assignments.empty? ? super : self 
end