有没有什么办法,给定某些条件,取消销毁活动记录的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. 在销毁回调之前
- 4. Rspec的before_destroy回调
- 5. Terraform销毁不执行。 “销毁已取消”
- 6. 点击'取消'按钮后销毁$ _SESSION
- 7. 登录使用“before_destroy”回调
- 8. 覆盖创建和销毁事件的Rails回调?
- 9. 调用backbone.js销毁
- 10. 重写销毁但保留回调
- 11. Rails before_destroy回调数据库变化总是回滚
- 12. rails polymorphic_url销毁行动
- 13. Rails销毁嵌套条目。
- 14. Rails 4:在before_destroy回调中访问变量
- 15. 无法调用View#从被销毁的回调中订阅
- 16. “无法注册销毁回调”警告消息导致内存泄漏?
- 17. angular2销毁视图销毁订阅
- 18. 销毁rails中的所有会话3
- 19. Ruby on rails rspec销毁计数失败
- 20. Rails v3会话销毁不起作用?
- 21. Rails - 销毁'连接表'协会
- 22. 耙耙销毁Rails 3对象?
- 23. Rails模型关联和销毁方法
- 24. Rails,如果空白就销毁
- 25. 销毁JMS消息监听器
- 26. 抢救重定向:在Rails中销毁之后回来?
- 27. rails 3.2:after_update在销毁元素时也被调用?
- 28. 只要模型销毁链接被点击,Rails会话就会被销毁
- 29. 当allow_destroy => true时取消关联而不是销毁对象
- 30. 销毁取消订阅的观察对象
使用Rails 5,返回false不再起作用。应该抛出(:中止)'以防止删除记录。看到[这个评论](http://stackoverflow.com/questions/123078/how-do-i-validate-on-destroy-in-rails#comment59333149_123190) – RFVoltolini
谢谢,我已经更新了我的答案,以帮助新人。 – Leito
感谢您指定:Rails 5的中止技术。应该真的帮助我。 – CanadaIT