有没有什么办法,给定某些条件,取消销毁活动记录的before_destroy回调对象?谢谢Rails - 取消销毁before_destroy回调
回答
您应该返回false
。
Rails的5
“取消回调
如果before_ *回调抛出:中止,所有后来的回调和相关动作被取消。”
轨道4,下
“取消回调
如果before_ *回调返回false,所有后来的回调和相关动作被取消。回调通常是在顺序运行它们被定义,在模型中被定义为方法的回调的例外,这被称为last。“
导轨包裹保存,并在交易破坏,所以在回调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
thnks,但不希望它引发任何事情......什么都不做 –
有道理。因为这是'before_ *'回调函数,所以'raise'或'false'都可以。 “提升”的好处是你会得到一个明确的信息,你可以在日志中追踪,而不是“摧毁”悄悄地没有发生。选择哪个取决于您的失败情况可能会如何意外。 –
在Rails 5中,你将不得不明确地提出:中止。你现在可以开始了。 – mwoods79
返回false
是做正确的方法:你可以看到在点6 Halting Execution
这里的文档
before_destroy do
if self.some_condition?
return false
end
end
。 http://guides.rubyonrails.org/active_record_callbacks.html
您也可以覆盖#destroy
方法:
def destroy
study_assignments.empty? ? super : self
end
- 1. Rails 3覆盖销毁无需取消回调并触发ROLLBACK
- 2. before_destroy和依赖销毁不点火
- 3. mongoid before_destroy回调
- 4. boost :: shared_ptr销毁回调
- 5. Rspec的before_destroy回调
- 6. Terraform销毁不执行。 “销毁已取消”
- 7. Rails has_many使用关联ID不会调用回调销毁
- 8. 竞争条件销毁回调
- 9. 点击'取消'按钮后销毁$ _SESSION
- 10. 覆盖创建和销毁事件的Rails回调?
- 11. 登录使用“before_destroy”回调
- 12. 调用backbone.js销毁
- 13. Spring Custom Scoped Bean - 销毁回调
- 14. 重写销毁但保留回调
- 15. Rails before_destroy回调数据库变化总是回滚
- 16. rails polymorphic_url销毁行动
- 17. 销毁会话,Rails设计
- 18. Rails:无法销毁关联
- 19. Rails,销毁与删除?
- 20. Rails 3 public_activity,销毁记录
- 21. Rails销毁嵌套条目。
- 22. Rails依赖销毁错误
- 23. Rails双重多态依赖:销毁没有正确销毁
- 24. Rails无法在删除前调用before_destroy
- 25. Rails devise before_destroy用户
- 26. Rails 4:在before_destroy回调中访问变量
- 27. 销毁调用实例
- 28. 销毁
- 29. Datamapper - 之前:销毁回调被调用两次?
- 30. 无法调用View#从被销毁的回调中订阅
使用Rails 5,返回false不再起作用。应该抛出(:中止)'以防止删除记录。看到[这个评论](http://stackoverflow.com/questions/123078/how-do-i-validate-on-destroy-in-rails#comment59333149_123190) – RFVoltolini
谢谢,我已经更新了我的答案,以帮助新人。 – Leito
感谢您指定:Rails 5的中止技术。应该真的帮助我。 – CanadaIT