Rails:从after_create回滚而不抛出Exception

时间:2015-10-20 13:19:01

标签: ruby-on-rails activerecord

我正在为Redmine开发一个插件(RoR 4.2),一旦创建/更新某个类型的问题,它就应该将数据发送到另一个系统。

我为问题创建了一个补丁,其中包含两个回调:before_updateafter_create。两者都调用相同的方法来执行。我使用after_create的原因是我需要将新创建的问题的ID发送到第二个系统。

我的问题是,从false返回before_update取消交易时,从after_create执行此操作无效。为了解决这个问题,我需要抛出一个Exception,它反过来会破坏Issue控制器,使它返回Error 500页面而不是一个漂亮的错误弹出窗口。

那么考虑到我不愿意覆盖控制器(如果可能的话),处理这种情况的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

这听起来像傻瓜的差事,因为异常通常在控制器层处理。当然,您可以在回调方法中挽救异常,例如记录消息。

但是你不能真正影响模型回调的控制器结果而不诉诸一些非常讨厌的黑客攻击。模型应该只关注它自己的状态 - 而不是应用程序流。

ActiveRecord并不真正关心after_*回调的返回值。

脂肪模型和瘦身控制器都很好。但让你的模特做一些事情,如通过电话交谈或发送电子邮件通常是一个可怕的想法。 ActiveRecord模型已经在维护数据和业务逻辑方面做了太多事情。他们不应该关心您对API x的请求失败时会发生什么。

您可能需要考虑使用Service Object来换行创建和更新模型。